{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "0051f274",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>.container { width:60% !important; }</style>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from IPython.display import display, HTML\n",
    "\n",
    "display(HTML(\"<style>.container { width:60% !important; }</style>\"))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "45818077",
   "metadata": {},
   "source": [
    "前面，我们有一个**scikit-learn代码模板**可以调用机器学习算法训练和预测数据。然而，许多机器学习算法对数据是有要求的，比如不能直接处理字符串类型的类别数据。我们需要对数据先进行处理才能用来训练算法。有一句流传很广的话：**数据和特征决定了机器学习的上限，而模型和算法只是逼近这个上限。**算法的效果的好坏和特征的处理和选择密切相关，这里我们只涉及一些基本的、必须的处理，如处理缺失值、分类数据转化、无量纲化、特征的选择等，更复杂的特征工程方法不做涉及。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aac35a5e",
   "metadata": {},
   "source": [
    "## 一. 缺失值的处理\n",
    "\n",
    "1. 数值数据(连续型)：\n",
    "  - 用平均值(mean)、中位数(median)取代: `df['x'] = df['x'].fillna(df['x'].median())`\n",
    "  - 时间序列可以用前一个有效值取代: `df['x'] = df['x'].fillna(method='ffill')` \n",
    "  - 如果缺失非常少且样本数量大，也可以考虑把有缺失的行删除: `df = df.dropna()`\n",
    "  \n",
    "\n",
    "2. 分类数据(离散型)：\n",
    "  - 用最常见的类别取代:`df['x'] = df['x'].fillna(df['x'].mode()[0])`\n",
    "  - 如果缺失值较多，用U(Unknow)取代 \n",
    "  - 如果缺失非常少且样本数量大，也可以考虑把有缺失的行删除: `df = df.dropna()`\n",
    "  \n",
    "  \n",
    "3. 使用模型预测缺失值，如KNN等"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "93fb3b77",
   "metadata": {},
   "source": [
    "## 二. 分类型特征的处理\n",
    "如果分类型特征的数据类型为字符串，分三种情况：\n",
    "- 如果字符串只有两个类别，表示为0和1即可。\n",
    "- 如果字符串大于两个类别且有明显关系，比如表示某种程度，可以比较大小，应当将其编码为连续的整数。例如：差/较差/一般/较好/好，可以编码为0、1、2、3、4\n",
    "- 如果字符串没有明显关系，用独热表示进行编码，\n",
    "\n",
    "**前两种情况用apply和lambda函数；第三种情况用独热编码。**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "f6e12e16",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>class</th>\n",
       "      <th>sex</th>\n",
       "      <th>score</th>\n",
       "      <th>price</th>\n",
       "      <th>等级</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>A</td>\n",
       "      <td>male</td>\n",
       "      <td>100</td>\n",
       "      <td>0.2</td>\n",
       "      <td>优秀</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>B</td>\n",
       "      <td>female</td>\n",
       "      <td>53</td>\n",
       "      <td>0.4</td>\n",
       "      <td>不及格</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>C</td>\n",
       "      <td>female</td>\n",
       "      <td>75</td>\n",
       "      <td>0.6</td>\n",
       "      <td>一般</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>B</td>\n",
       "      <td>male</td>\n",
       "      <td>87</td>\n",
       "      <td>0.8</td>\n",
       "      <td>良好</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  class     sex  score  price   等级\n",
       "0     A    male    100    0.2   优秀\n",
       "1     B  female     53    0.4  不及格\n",
       "2     C  female     75    0.6   一般\n",
       "3     B    male     87    0.8   良好"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "\n",
    "# 准备示例数据\n",
    "data = [['A', 'male', 100, 0.2, \"优秀\"], ['B', 'female', 53, 0.4, \"不及格\"], \n",
    "        ['C', 'female', 75, 0.6, \"一般\"], ['B', 'male', 87, 0.8, \"良好\"]]\n",
    "df = pd.DataFrame(data, columns=['class', 'sex', 'score', 'price', '等级'])\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "c610a7dd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 0, 0, 1], dtype=int64)"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# sex列是第一种情况\n",
    "dic = {'female': 0, \"male\": 1}\n",
    "new = df['sex'].apply(lambda x: dic[x])\n",
    "arr1 = new.values\n",
    "arr1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "5893f0d2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([3, 0, 1, 2], dtype=int64)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 等级列是第二种情况\n",
    "dic = {'不及格': 0, \"一般\": 1, \"良好\": 2, \"优秀\": 3}\n",
    "new = df['等级'].apply(lambda x: dic[x])\n",
    "arr2 = new.values\n",
    "arr2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "46558c63",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 0, 0],\n",
       "       [0, 1, 0],\n",
       "       [0, 0, 1],\n",
       "       [0, 1, 0]], dtype=uint8)"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# class列是第三种情况，用pd.get_dummies()函数\n",
    "new = pd.get_dummies(df['class'])\n",
    "arr3 = new.values\n",
    "arr3"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e1b1b530",
   "metadata": {},
   "source": [
    "## 三. 数值型特征的无量纲化\n",
    "某些机器学习算法对数据的量纲比较敏感，如A列是1000-10000之间的数值，B特征是0.0001-0.001之间的数值，直接当作特征输入算法训练，效果会不好。无量纲化使不同规格的数据转换到同一规格。常见的无量纲化方法有**标准化**和**区间缩放法**。标准化是将数据转换成标准正态分布。区间缩放法利用了边界值信息，将特征的取值区间缩放到某个特定的范围，例如[0, 1]等。\n",
    "\n",
    "**建议对数值型特征都进行无量纲化处理。目标值和分类型特征不需要进行无量纲化处理**\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "d268c232",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.22853409, -1.34164079],\n",
       "       [-1.48869425, -0.4472136 ],\n",
       "       [-0.21680013,  0.4472136 ],\n",
       "       [ 0.47696029,  1.34164079]])"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#标准化，返回值为标准化后的数据\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "# 将分类型特征和目标列删除\n",
    "df_num = df.drop(['class', 'sex', '等级'], axis=1) \n",
    "arr_num = StandardScaler().fit_transform(df_num.values)\n",
    "arr_num"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "ba9da994",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1.        , 0.        ],\n",
       "       [0.        , 0.33333333],\n",
       "       [0.46808511, 0.66666667],\n",
       "       [0.72340426, 1.        ]])"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 区间缩放，返回值为缩放后的数据\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "# 将分类型特征和目标列删除\n",
    "df_num = df.drop(['class', 'sex', '等级'], axis=1) \n",
    "arr_num = MinMaxScaler().fit_transform(df_num.values)\n",
    "arr_num"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "efe2c812",
   "metadata": {},
   "source": [
    "## 四. 合并处理后的分类型特征和数值型特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "4ac895b3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1.        , 0.        , 1.        , 3.        , 1.        ,\n",
       "        0.        , 0.        ],\n",
       "       [0.        , 0.33333333, 0.        , 0.        , 0.        ,\n",
       "        1.        , 0.        ],\n",
       "       [0.46808511, 0.66666667, 0.        , 1.        , 0.        ,\n",
       "        0.        , 1.        ],\n",
       "       [0.72340426, 1.        , 1.        , 2.        , 0.        ,\n",
       "        1.        , 0.        ]])"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "x = np.c_[arr_num, arr1, arr2, arr3]\n",
    "x"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a8115bb0",
   "metadata": {},
   "source": [
    "## 四. 特征的选择\n",
    "\n",
    "不是所有的特征都适合一股脑扔给算法去训练，过多无效特征甚至可能降低模型的表现，少则得，多则惑。我们通过前面的数据可视化，对哪些特征是否有效有一个初略的判断，还可以用相关系数法，计算各列间的相关系数，得到相关系数矩阵，然后选择目标列的相关系数绝对值大的特征去训练算法。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "67749cfc",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "列名: Index(['PassengerId', 'Survived', 'Sex', 'Age', 'SibSp', 'Parch', 'Ticket',\n",
      "       'Fare', 'Embarked_C', 'Embarked_Q', 'Embarked_S', 'Pclass_1',\n",
      "       'Pclass_2', 'Pclass_3', 'Master', 'Miss', 'Mr', 'Mrs', 'Officer',\n",
      "       'Royalty', 'Cabin_A', 'Cabin_B', 'Cabin_C', 'Cabin_D', 'Cabin_E',\n",
      "       'Cabin_F', 'Cabin_G', 'Cabin_T', 'Cabin_U', 'FamilySize',\n",
      "       'Family_Single', 'Family_Small', 'Family_Large'],\n",
      "      dtype='object')\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Survived</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Ticket</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Embarked_C</th>\n",
       "      <th>Embarked_Q</th>\n",
       "      <th>...</th>\n",
       "      <th>Cabin_D</th>\n",
       "      <th>Cabin_E</th>\n",
       "      <th>Cabin_F</th>\n",
       "      <th>Cabin_G</th>\n",
       "      <th>Cabin_T</th>\n",
       "      <th>Cabin_U</th>\n",
       "      <th>FamilySize</th>\n",
       "      <th>Family_Single</th>\n",
       "      <th>Family_Small</th>\n",
       "      <th>Family_Large</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1</td>\n",
       "      <td>22.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>A/5 21171</td>\n",
       "      <td>7.2500</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0</td>\n",
       "      <td>38.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>PC 17599</td>\n",
       "      <td>71.2833</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0</td>\n",
       "      <td>26.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>STON/O2. 3101282</td>\n",
       "      <td>7.9250</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>3 rows × 33 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   PassengerId  Survived  Sex   Age  SibSp  Parch            Ticket     Fare  \\\n",
       "0            1       0.0    1  22.0      1      0         A/5 21171   7.2500   \n",
       "1            2       1.0    0  38.0      1      0          PC 17599  71.2833   \n",
       "2            3       1.0    0  26.0      0      0  STON/O2. 3101282   7.9250   \n",
       "\n",
       "   Embarked_C  Embarked_Q  ...  Cabin_D  Cabin_E  Cabin_F  Cabin_G  Cabin_T  \\\n",
       "0           0           0  ...        0        0        0        0        0   \n",
       "1           1           0  ...        0        0        0        0        0   \n",
       "2           0           0  ...        0        0        0        0        0   \n",
       "\n",
       "   Cabin_U  FamilySize  Family_Single  Family_Small  Family_Large  \n",
       "0        1           2              0             1             0  \n",
       "1        0           2              0             1             0  \n",
       "2        1           1              1             0             0  \n",
       "\n",
       "[3 rows x 33 columns]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 假设我们通过数据预处理、可视化，得到了很多特征\n",
    "df = pd.read_csv('processed_data.csv')\n",
    "print(\"列名:\", df.columns)\n",
    "df.head(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "6aa6fd78",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Survived</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Embarked_C</th>\n",
       "      <th>Embarked_Q</th>\n",
       "      <th>Embarked_S</th>\n",
       "      <th>...</th>\n",
       "      <th>Cabin_D</th>\n",
       "      <th>Cabin_E</th>\n",
       "      <th>Cabin_F</th>\n",
       "      <th>Cabin_G</th>\n",
       "      <th>Cabin_T</th>\n",
       "      <th>Cabin_U</th>\n",
       "      <th>FamilySize</th>\n",
       "      <th>Family_Single</th>\n",
       "      <th>Family_Small</th>\n",
       "      <th>Family_Large</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>PassengerId</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>-0.005007</td>\n",
       "      <td>0.013406</td>\n",
       "      <td>0.025731</td>\n",
       "      <td>-0.055224</td>\n",
       "      <td>0.008942</td>\n",
       "      <td>0.031416</td>\n",
       "      <td>0.048101</td>\n",
       "      <td>0.011585</td>\n",
       "      <td>-0.049836</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000549</td>\n",
       "      <td>-0.008136</td>\n",
       "      <td>0.000306</td>\n",
       "      <td>-0.045949</td>\n",
       "      <td>-0.023049</td>\n",
       "      <td>0.000208</td>\n",
       "      <td>-0.031437</td>\n",
       "      <td>0.028546</td>\n",
       "      <td>0.002975</td>\n",
       "      <td>-0.063415</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Survived</th>\n",
       "      <td>-0.005007</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>-0.543351</td>\n",
       "      <td>-0.070323</td>\n",
       "      <td>-0.035322</td>\n",
       "      <td>0.081629</td>\n",
       "      <td>0.257307</td>\n",
       "      <td>0.168240</td>\n",
       "      <td>0.003650</td>\n",
       "      <td>-0.149683</td>\n",
       "      <td>...</td>\n",
       "      <td>0.150716</td>\n",
       "      <td>0.145321</td>\n",
       "      <td>0.057935</td>\n",
       "      <td>0.016040</td>\n",
       "      <td>-0.026456</td>\n",
       "      <td>-0.316912</td>\n",
       "      <td>0.016639</td>\n",
       "      <td>-0.203367</td>\n",
       "      <td>0.279855</td>\n",
       "      <td>-0.125147</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Sex</th>\n",
       "      <td>0.013406</td>\n",
       "      <td>-0.543351</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.057397</td>\n",
       "      <td>-0.109609</td>\n",
       "      <td>-0.213125</td>\n",
       "      <td>-0.185484</td>\n",
       "      <td>-0.066564</td>\n",
       "      <td>-0.088651</td>\n",
       "      <td>0.115193</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.057396</td>\n",
       "      <td>-0.040340</td>\n",
       "      <td>-0.006655</td>\n",
       "      <td>-0.083285</td>\n",
       "      <td>0.020558</td>\n",
       "      <td>0.137396</td>\n",
       "      <td>-0.188583</td>\n",
       "      <td>0.284537</td>\n",
       "      <td>-0.255196</td>\n",
       "      <td>-0.077748</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>3 rows × 32 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "             PassengerId  Survived       Sex       Age     SibSp     Parch  \\\n",
       "PassengerId     1.000000 -0.005007  0.013406  0.025731 -0.055224  0.008942   \n",
       "Survived       -0.005007  1.000000 -0.543351 -0.070323 -0.035322  0.081629   \n",
       "Sex             0.013406 -0.543351  1.000000  0.057397 -0.109609 -0.213125   \n",
       "\n",
       "                 Fare  Embarked_C  Embarked_Q  Embarked_S  ...   Cabin_D  \\\n",
       "PassengerId  0.031416    0.048101    0.011585   -0.049836  ...  0.000549   \n",
       "Survived     0.257307    0.168240    0.003650   -0.149683  ...  0.150716   \n",
       "Sex         -0.185484   -0.066564   -0.088651    0.115193  ... -0.057396   \n",
       "\n",
       "              Cabin_E   Cabin_F   Cabin_G   Cabin_T   Cabin_U  FamilySize  \\\n",
       "PassengerId -0.008136  0.000306 -0.045949 -0.023049  0.000208   -0.031437   \n",
       "Survived     0.145321  0.057935  0.016040 -0.026456 -0.316912    0.016639   \n",
       "Sex         -0.040340 -0.006655 -0.083285  0.020558  0.137396   -0.188583   \n",
       "\n",
       "             Family_Single  Family_Small  Family_Large  \n",
       "PassengerId       0.028546      0.002975     -0.063415  \n",
       "Survived         -0.203367      0.279855     -0.125147  \n",
       "Sex               0.284537     -0.255196     -0.077748  \n",
       "\n",
       "[3 rows x 32 columns]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 构建相关系数矩阵\n",
    "corr = df.corr()\n",
    "corr.head(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "67d52d1a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAj0AAAHaCAYAAADrOPimAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAB/4ElEQVR4nO3dd7hcVfX/8fcnPSGQAEIIUkKTDqFIEaSjgAiiSJUmiNhFUREREEWwIqAgERHwh3T4goj0jkBoqSA9SA89vd27fn/sPeRkMm2fO3PvzJ314pmHKXuffWYyd2bNbktmhnPOOedcb9enp0/AOeecc647eNDjnHPOubbgQY9zzjnn2oIHPc4555xrCx70OOecc64teNDjnHPOubbgQY9zzjnn6k7ShZKmSppU5nFJOlvSc5ImSNo089hukp6Ojx1fr3PyoMc555xzjXARsFuFx3cH1oqXo4HzACT1Bf4UH18POFDSevU4IQ96nHPOOVd3ZnYv8G6FInsDl1jwEDBc0khgC+A5M3vBzOYBl8eyXeZBj3POOed6wkeBlzO3X4n3lbu/y/rV4yAO5r/9QnI+j3vX/3FS+f7qTG0CkZ5m5F0GJJUfZvOT2+ivtPPq2yf9uc/p6JtUfrrS/xyGk/7cU02z/sl1BtORVH6m0l4rgGEsSCrfN8d7ca41/neZoaTyef4OO3Nk++lMPK/U5wHpnw+zSX+f9E9sox/pr++8xN/vSyrtvQv53ovTEj9TPvfGP9L/ERPl+a4qZ8Bya3yVMCxVMMbMxiQcotTztQr3d1mXgx5JHcDEeKyngMPMbFZXj9sTJN0NHGdmjxbdfziwuZl9syfOyznnnGs2McBJCXKKvQKsnLm9EvAaMKDM/V1Wj59Rs81stJltAMwDjqnDMbtdnDjlnHPO9V6dHfW7dN0NwKFxFddWwAdm9jrwCLCWpNUkDQAOiGW7rN59x/cBa0r6rKSHJT0h6XZJIwAkbS9pXLw8IWlJSSMl3RvvmyTpk7HspyQ9KOlxSVdJGhrvnyLpZ/H+iZLWifcvJ+m2eP/5kl6S9JH42JckjY1tnF8IcCTNkHSqpIeBrbNPRNIRkp6RdA+wTZ1fJ+ecc677WWf9LlVIugx4EFhb0iuSjpR0jKRC58hNwAvAc8BfgK8DmNkC4JvALYQRpCvNbHI9nn7d5vRI6kdYXnYzcD+wlZmZpKOAHwLfB44DvmFmD8QgZg5hPPAWMzstBiNDYrByIrCLmc2U9CPge8Cpsbm3zWxTSV+PxzwKOBm408xOl7RbPC6S1gX2B7Yxs/mSzgUOBi4BlgAmmdlJsWzhuYwEfgZsBnwA3AU8Ua/XyjnnnOvtzOzAKo8b8I0yj91ECIrqqh5Bz2BJ4+L1+4C/AmsDV8TgYQDwYnz8AeD3ki4FrjWzVyQ9AlwoqT/wf2Y2TtL2hLX5D8RAZAAhWiy4Nv7/MeDz8fq2wD4AZnazpPfi/TsTgpdH4rEGA1PjYx3ANSWe05bA3Wb2FoCkK4CPJb0qzjnnXLPpTJ8o3pvUc07PaDP7VlxTfw7wRzPbEPgqMAjAzM4g9MoMBh6StE5cx78d8Crwd0mHEmZu35Y57npmdmSmzbnx/x0sDNzKzXoXcHHmWGub2SnxsTlmVm5gsupMcUlHS3pU0qMXXHJZteLOOedcjzLrrNulFTVqPegwQhADcFjhTklrmNlEM/sV8CiwjqRVgalm9hdCL9GmwEPANpLWjPWGSKrW03I/sF8s/ylg6Xj/HcC+kpaPjy0T26zkYWAHScvGHqgvlipkZmPMbHMz2/yoQyv24jnnnHOuhzVqn55TgKskvUoIYFaL939X0o6EHpongX8TZmX/QNJ8YAZwqJm9FZeJXyZpYKx7IvBMhTZ/FsvvD9wDvA5MN7O3JZ0I3CqpDzCfMIb4UrkDmdnrkk4hDKm9DjwOOTaocM4555pJmw9vKcwjan0xOOowswWStgbOM7PR3dW+b06YxjcnrJ1vTthYvjlh7XxzwjTNuDnhvJfH129zwpU3bvj51ltv2pF5FeDK2JszD/hKD5+Pc84555pIrwl6zOxZYJOePg/nnHOuadVnU8GW1WuCnp6WOlQFsN3k05PK777J15Lb+Pr8ZZPrDEqclT9s4LzkNlZc4/2k8jPfHli9UJEpU4cnlX+jX3rX/dYbpu2M/tpTSyW3cT3pw1sHd86tXihjky0/SG5j3wfThkGv+WT6UOBDd45IKp9n2CJ1MGWlEemv1ewZaa8VQL8Bjf9y+mDa4KTy/TrSR0ZmWdrf1c2D0/8O95yT9u8+dsCg5DYOWffl6oWK3DRp5eqFuluLrrqql6bIsi7pJ5ImS5oQd03esg7H3EvS8XU6vxn1OI5zzjnnek6P9/TEScd7Apua2dy4G3NNP4sk9YvbVS/GzG6gTrk6nHPOuV6hzVdvNUNPz0hCWom5AGb2tpm9FnNsFXJnbR4zoCPpFEljJN0KXBJzfK1fOJikuyVtJulwSX+UNCweq098fIiklyX1l7SGpJslPSbpvkwer9Vi3q9HJP28m18P55xzriF8c8KedyuwckzueW5MQVHNZsDeZnYQcDkLNyUcCaxoZo8VCprZB8B4oHDczxJyfc0HxgDfMrPNCDm8zo1lziIsef848EaXn6FzzjnnelyPBz1mNoMQxBwNvEXI2XV4lWo3mNnseP1KFu6YvB9wVYnyVxCSjkLYDPGKmPD0E4RNFMcB5xN6nSBkVS/klfh7yvNxzjnnmlZnZ/0uLajH5/QAxPxXdwN3S5pISF2xgIVBWfFU+5mZuq9KekfSRoTA5qslmrgBOF3SMoQA605ChvX3K2xgWFPuLWI29+8uuRl7Dl6jWhXnnHOu57TosFS99HhPj6S1Ja2VuWs0IUXEFEKAAvCFKoe5HPghMMzMJhY/GHuTxhKGrW40sw4zmwa8KOmL8TwkaeNY5QFCjxDAweUazebe8oDHOedc0+vsqN+lBfV40AMMBS6W9KSkCcB6hNxdPwPOknQfVN1T/2pCkHJlhTJXAF+K/y84GDhS0nhgMrB3vP87wDckPUJInuqcc865Ftfjw1tx0vEnSjx0H7BYZnUzO6XEfW9S9FzM7CLgosztq2HR5DRm9iKwW4njvQhsnbnrjPLPwDnnnGsRbT681eNBj3POOee6SYtOQK6XZhjecs4555xrOO/pqZP+So+eU3Np/fuJ85LbGLfx95PrPGNLJJV/iiWT2xj4XFqdleanv77z+6h6oYxtBr6X3MYt49Ny6yzbkZ4b6stDpyXXGTg0rZ1P3DMruY1xt6flm9t1918nt3H2oLTzmjpnSHIbS/VNyx03duryyW2kZ5OC/jPT8lz1s/S8WIMSM4+92yf9K2MF0vLAHTloZvVCRW7tSMsxeMj66Xm0zntypeQ663am/5s0nA9vtQ9JPwEOIkyM7gS+amYP9+xZOeecc92kzYe32ibo6UqOL+ecc861vnaa01Mux9dmku6J+bdukTQy5ut6WtLaAJIuk/SVHj1755xzrovMOup2aUXtFPQsluNLUn/gHGDfmH/rQuC0mK/rm8BFkg4Aljazv/TcqTvnnHN1YJ31u7SgthneMrMZkjYDPgnsSNik8BfABsBtkiDMN3w9lr8t7tb8J2Djkgd1zjnnXMtom6AHSub4+gYw2cy2Li4rqQ+wLjAbWAZ4pUSZD3NvfX/JTdlryOqNO3nnnHOuq9p8InPbDG+VyfH1FLBcnOSMpP6S1o+PHxsfPxC4MA6FLSKbe8sDHuecc03Ph7faxlDgHEnDCRncnyP00owBzpY0jPB6/EHSfOAoYAszmy7pXuBE4OQeOXPnnHPOdVnbBD0Vcny9DWxX4v51M3W/16jzcs4557pNi2ZHr5e2CXqcc865tteiw1L10jZzepxzzjnX3rynp05Eeo6Vr89PyxeTJ4/W6PG/S67z0CYnJZVfNkdv6XbLTE0q//77g5PbeGfeoKTyz84cltzGnru+nlR+7K0fSW7j7x3p5/XBjLTcWwcNTj+vVw76fVL5/zcyuQnmz0nL2zR/QXqWq6FD0tpYvyMtVxfAkCXS68ybm/bxPH9++nN/dnZ63rxUqb+sL5u9THIbS6el2WPqM0OT29hsTvoH3cv9m/Ar1ldvtQdJ+0gySev09Lk455xzPaLNV2+1TdBDWHp+P3BAT5+Ic84557pfWwQ9koYC2wBHEoMeSX1iOorJkm6UdJOkfeNji+Xj6sHTd8455+qjs7N+lxbUhAOODfE54GYze0bSu5I2BVYHRgEbAssTNiIsbEJ4DrC3mb0laX/gNODLPXLmzjnnXL20aLBSL+0S9BwI/CFevzze7g9cZWadwBuS7oqPr02ZfFzOOeeca129PuiRtCywE7CBJCMEMQZcV64KZfJxlTj2h7m3jltyE8+95ZxzrqmFFJTtqx3m9OwLXGJmq5rZKDNbGXiRsBPzF+LcnhHADrH805TPx7UIz73lnHOupbT5nJ52CHoOZPFenWuAFQmZ0ycB5wMPAx+Y2TxCoPQrSeOBcZROX+Gcc865FtLrh7fMbIcS950NYVWXmc2IQ2BjgYnx8XGUzsflnHPOta4W3V+nXnp90FPFjTHr+gDg52b2Rg+fj3POOdc4LTosVS9tHfSU6gVyzjnnXH1I2g04i7CI6AIzO6Po8R8AB8eb/YB1geXM7F1JU4DpQAewwMw27/L5mKXnjHKLu36Fg5JfyP6J3Yzv9U2PUd9NT8fDMU+cmlR+1g+OTm7j7UfSTuzJt9Pz8aT6aP9ZyXXemJeWE6xDiUmCyHdeq231QVL5Fx9Kz+91S5+0vE27LJiZ3Mb7CwYk10k1L3Fq4wDSfykv2Xd+cp3pHf2TyneQ/t7qn5gzsG+O5z4/8fXtn6ONrW49Iqn8jnv8JrmN//tY+nkt9a1PJ5Uf/PkT0v8RE82+/c91+9IfvMsxFc9XUl/gGWBXwhzaR4ADzezJMuU/CxxrZjvF21OAzc3s7Xqdc6+YyCzpJ3Fn5QmSxknaUtIFktaLj88oU28rSQ/HOk9JOqVbT9w555zrTt27emsL4DkzeyEuEroc2LtC+QOBy+rwLMtq+eGtuLR8T2BTM5sr6SPAADM7qobqFwP7mdn4GJGu3chzdc4559rIR4GXM7dfAbYsVVDSEGA34JuZuw24Ne6xd76ZjenqCfWGnp6RwNtmNhfAzN42s9ck3S3pw/E/Sb+T9LikOyQtF+9enrjbspl1FLrcJJ0i6e+S7pT0rKSvdPNzcs455+qvjlnWJR0t6dHMpXiuQ6nhr3LDa58FHjCzdzP3bWNmmwK7A9+Q1OVV1b0h6LkVWFnSMzGB6PYlyiwBPB5fvHuAk+P9ZwJPS7pO0lclDcrU2Qj4DLA1cJKkFRv4HJxzzrnGq+PwVnaD3ngp7ol5BVg5c3sl4LUyZ3YARUNbZvZa/P9Uwn57W3T16bd80GNmM4DNCOkg3gKukHR4UbFO4Ip4/f8B28a6pwKbEwKng4CbM3WuN7PZcQLVXdThxXbOOefayCPAWpJWkzSAENjcUFxI0jBge+D6zH1LSFqycB34FGEz4S5p+Tk9EIamgLuBuyVNBA6rViVT93ngPEl/Ad6KGxUuUqbM7UVyb31tyY/z6SFr5nsCzjnnXHfoxn16zGyBpG8CtxCWrF9oZpMlHRMf/3Msug9wq5lll3iOAK6Lib/7Af8ws2zHRC4tH/RIWhvoNLNn412jgZcImdIL+hBSS1xO6NG5P9b9DHCThXX7axH2Ang/1tlb0umEobEdgOOL245deWMg35J155xzrlt1847MZnYTcFPRfX8uun0RcFHRfS8AG9f7fFo+6AGGAufEnZUXAM8Rel+uzpSZCawv6THgA2D/eP8hwJmSZsW6B5tZR4wsxwL/AlYh7NZcbhzSOeeccy2g5YMeM3uM0glBd8iUGRqv/rSo7gEVDv2MmaXvuuecc841K09D4Zxzzrm24AlHXTEzO6Wnz8E555xz9eVBT50Ms/TcOsMGzksq/xRpuY4Alu1IrpKcS2vIb9I3yRz02Vo2zM608Vb6r5OpOXKVpUrNXdQ/R667mfPTcjABzHsrrXynpaf8eV9pb66RK6XlAwN4a8rySeXz7MHRN/HfcNkBc5LbmDYvPYdYai6tPDnB+iutzqC+6R8oqfnTZpGeMNA+mJpUfojS/6awtM9rAN57t3qZ7tbmw1stv08PgKSOmD9rkqSr4nbWXTneKEld3g/AOeecayp13JG5FfWKoAeYbWajzWwDYB5wTC2VJHlPl3POOdcmeuOX/n3ARjFF/YnAAOAdwnL0N2Mm9RWBUcDbko4F/gysHut/jbBNdt+4YeEngFeBvc1sdnc+Eeecc66ufHir94g9N7sDEwkbEG5lZpsQNiX8YaboZoQg5iDgbOAeM9sY2BSYHMusBfzJzNYnbFj4hW55Es4551yj1DH3VivqLT09gyWNi9fvA/4KrE3IwzWS0NvzYqb8DZlem52AQ+HDdBYfSFoaeNHMCsd8jNAz5JxzzrkW1Vt6egpzekab2bfMbB5wDvBHM9sQ+CqQzaA+s+RRFjU3c72DEgGipKMlPSrp0X/OfqEr5++cc841nln9Li2otwQ9pQwjzMWByglI7yDM40FSX0lL1dqAmY0xs83NbPPPDl69egXnnHOuJ7X58FZvDnpOAa6SdB/wdoVy3wF2jNnZHwPW74Zzc84551w36xVzejK5tbL3XQ9cX+L+U4puvwnsXeKwG2TK/LbrZ+mcc871sBbtoamXXhH0OOecc64GLbqpYL305uEt55xzzrkP9eqeHkkdhD17Cj5nZlMa0VZ/pc9kX3GN95PKD3wuPffWdsuk5aQBePuRtNw3qXm0AJb/5wVJ5QceckRyGzdOWDmp/Ngcuc0O/dmySeWv/vk7yW3c0X9Bcp0jnlouqfzwQXOrFyqyUkfa+2TmBwOT2ximtOfeHb9h19wjPfeWlP76Pvuv9Ncr1RvzBieVn70g/SujX+K/ylkDZyS3Mfr4i5PKb9NvxeQ25s54I7nO63+YkFR+9SOTm0jnw1u92mwzG51SQZIAmbV5H6Bzzrnep0WXmtdLWw1vSRoq6Q5Jj0uaKGnveP8oSU9JOhd4HFhZ0g8kPSJpgqSf9eyZO+ecc3XgS9Z7tcEx+/o4SdcBc4B9zGxTYEfgd7FnB8IOzpfEtBVrE9JQbAGMBjaTtF33n75zzjnn6qWthrck9Qd+GQOYTuCjwIj48Etm9lC8/ql4eSLeHkoIgu7tjpN2zjnnGqJFe2jqpbcHPcUOBpYDNjOz+ZKmsDA9RTY1hYDTzez8SgeTdDRwNMAPltyEvYf4rszOOeeaWJtPV+3tw1vFhgFTY8CzI7BqmXK3AF+WNBRA0kclLV9cKJuGwgMe55xzrrm1W0/PpcA/JT0KjAP+W6qQmd0qaV3gwTjlZwbwJSB9/bdzzjnXJKyzvVdv9eqgpzg9hZm9DWxdpvgGRWXPAs5q0Kk555xz3a/N5/S02/CWc84559pUr+7pcc4551xGm09k9qCnTvr2SX8jzXw7bZv5leant/H++2nbzAO8On9IUvkhb6WfV2paiWF//1tyG3M2OSmp/E+nPZLcxv63jUwq38FKyW1s2ZH+bzif+Unl35qT3sbKSvt3nzsn/eNmrqV1Rg8fkJ7uoV/ftOfx1gPJTeSaRzGgf0dS+Q9mDapeqEjqv0ier8sOVL1QxpYantzGuOfTUsis3TftnADm53j/PvrOR5LKd8tymDaf0+PDW84555xrC7mDHkkdmd2Ox0k6PqHuDpJuzNt2PMbdkjbPWfciSftWeLy/pDMkPStpkqSxknbPf7bOOedcE2jzNBRdGd5KTuZZL5LS0jun+zkwEtjAzOZKGgFs3+A2nXPOucZq0WClXuo+vCVpiqRfSnpQ0qOSNpV0i6TnJR2TKbqUpOskPSnpz5L6xPrnxXqTs4k+43FPknQ/8MXM/X0kXSzpF5L6SvpNJlHoV2MZSfpjbOtfwGIbDWaONwT4CvAtM5sLYGZvmtmVdX2hnHPOOdetutLTM1jSuMzt083sinj9ZTPbWtKZwEXANoR0D5OBP8cyWwDrAS8BNwOfB64GfmJm78benDskbWRmE2KdOWa2LUAMoPoRNhycZGanxbQQH5jZxyUNBB6QdCtQSCK6ISHX1pPAhWWe15rA/8xsWu5XxjnnnGtG1t4TmRs1vHVD/P9EYKiZTQemS5ojfTg1f6yZvQAg6TJgW0LQs18MXvoRhpjWAwpBTyGoKjgfuNLMTou3PwVslJmvM4yQKHQ74DIz6wBek3RnnidcLJt760fDRvO5IavV47DOOedcY/jwVkMU1o12Zq4XbhcCreJw0yStBhwH7GxmGwH/YmFCUFg0KSjAf4AdJRXKiDAsNTpeVjOzW8u0V85zwCqSqq6BzObe8oDHOeeca249uWR9C0mrxbk8+wP3A0sRApsP4uThaium/grcBFwlqR8hUejXJPUHkPQxSUsA9wIHxDk/I4Edyx3QzGbF454taUA8zkhJX+rKk3XOOed6XKfV79KC6jmn52Yzq3nZOvAgcAZhns29wHVm1inpCcLcnxeAqtuAmdnvJQ0D/g4cDIwCHlfIFPoW8DngOmAnwnDbM8A9VQ57IvAL4ElJcwiBWNpOd84551yz8R2Z8zGzksvGzWxU5vpFhInMxY/dHS+l6h9e7bjx9g6Z6ydnHjohXop9s9Rxy7Q1D/hhvDjnnHOuF/A0FM4551y7aNFhqXpp66BH0nVA8QzkH5nZLanHmtORvl/ilKnDk8rP75OeL+adeen5eBJT5TC1b/rb6MYJKyeVT82jBXDkE6cmlf/3pt9ObuOKscOTyqdlNQs+v9oryXUmPz0iqfxaK7+d3MbYV1dIKj953lLJbSzPgqTyb8/Lk6cs7Q0/d07632Ge3VRTv5r651iK3D+xlTyTQFPr7Df43eQ2JsxbJqn8pkukt/HAe8sl11mhM+392x2szVdvtXXQY2b79PQ5OOecc6575Fq91cvzbg2Q9Ie4g/Rzkm6UtEr+s3XOOeeaRJuv3sq7ZH12Zi+c0WZ2Rl3PqoJuyLv1S2BJ4GNmtiZwDXB9IU2Gc84517Kss36XGkjaTdLTsRNhsQ6S2BHyQaYT5aRa6+ZR1y/yXpJ36wjg2Lh7M2b2N2AGsEsdXyrnnHOuV4udFH8i7Lm3HnCgpPVKFL0v04lyamLdJHmDnsFFw1v7Zx572cy2Bu4jLFffF9gKyM4q3QL4PmGPnjUIebcg5N3aHNgI2F7SRpk6c8xsWzO7PN4u5N16xsxOBI4k5t0CPg58Je7wvA8L8259BfhEhedVLu/Wo4QX3TnnnGtd3Tu8tQXwnJm9ELeCuRzYu8Yz7Urdsuo1vJXNiZXNu/WwmU03s7eAxfJuxd6UQt4tCHm3HgeeANZn0UCjVN6tSUV5tw6NGyY+DCxLUd4tM3sNqJR3S5ReNFFyuYako2PP1KP/nP1ChcM655xzTaCzs36X6j4KvJy5/Uq8r9jWksZL+rek9RPrJmnEPJVWz7u1aom8W5sSensWPelM7q3PDl69xiacc8651pf94R8vRxcXKVGt+Pv4cWBVM9sYOAf4v4S6yXpqcm6z5t2aCVwM/L4wYVrSocAcakiJ4ZxzzjW1Og5vZX/4x8uYotZeAbKbsq0EvJYtYGbTzGxGvH4T0F/SR2qpm0fefXp6c96tHwO/AZ6WNDgeZ2uzHDt/Oeecc82ke3NvPQKsFUdyXgUOAA7KFpC0AvCmmZmkLQidMe8A71erm0euoKeX592aC3wb+Hb8x7gZOAQojmCdc845V4aZLZD0TcJITF/gQjObXFjNbWZ/Jix2+pqkBcBs4IDYyVCyblfPqa13ZK7GzN4ARvf0eTjnnHN10c2bCsYhq5uK7vtz5vofgT/WWrer2jboUR3zbgFMV/pL+Ua/tH0Wtxn4XnIbz84cllxn5f7Fc8brbyzFc8Ur++m0R5LbSM2ldfXjZye3cX5iTrAdRr6e3EZqHi2A/krrwr73tZHJbYwe/H5S+ddmDk1uQ4nzFmc3fO9SmK/03Ftz06swJPHLaTAdyW0MTHyfSOlfmAus8VNH1xowPan8W9OXSG5jKdKHhVYY3PjP0lSee6tNed4t55xzrr10KQRX787BtaekJ+LeAU8Wdnh2zjnnWlab597qak/PbDMbXY8TSaUG5uCKy97HAFuY2SuSBhJWhjnnnHOtq0WDlXppyGBrq+fgIiQc7UdYNoeZzTWzp+v3CjnnnHOuu3W1p6d4v57TMykpXjazrSWdSVi6vg1hh+XJQGHm9haEVBMvEZaGfx64mpCD693Ym3OHpI3MbEKsM8fMtgWIAVQhB9ckMzst7gj5gZl9PPbQPCDpVmATFubgGgE8CVxY6knFtm8AXpJ0B3AjIZVFe88Ac84519ra/Gusqz09vTUHF2Z2FLAzMJaQHmOxACm7BffNs56rdDjnnHOu57X5nJ5GriVs5RxcobDZRDM7E9gV+EKJxz/cgnu3IWumHNo555xz3ayncm8VNGUOLklDJe2QuWs0YQjOOeeca1nWaXW7tKJ6z+npLTm4BPxQ0vmEbbFnAocnPC/nnHOu+bRosFIvXQp6emsOLjObDuxRS1nnnHPOtYa23ZHZOeecazuehqK91SsH13DmJ7e99YavJZW/ZfzKyW3suWt6rqcHbl0uqXz/xPxIAIf+bNmk8vvflp4b6oqxw5PKp+bRAvjqE6cmlT9p8xOT27itz8vJdX7EKknlR3Skv38nzknL67bp0u8mtzF3TtpH1Ap90z/Qh4+YlVR+6IYDktvou3x6DrzZY99MKr9gdnqCr/88s2JS+UE5vjCX6Tsvqfy2r7+Q3MbfB22SVH5qv/Svvm2XmZpcZ8JbH0kqv1FyCzn48FZ78xxczjnnXHvo6dVbH8rk8Zok6SpJQyqUPUXScQ0+nwslTZU0qZHtOOecc93G9+lpGoWNDjcA5gHHVKvQYBcBu/XwOTjnnHN1Y2Z1u7SiZgp6su4D1gSQdGjMoTVe0t+LC0r6SsyzNV7SNYUeIklfjL1G4yXdG+9bX9LY2KM0QdJa5U7AzO4F0ichOOecc64pNd2cnrjB4O7AzZLWB34CbGNmb0tapkSVa83sL7HuL4AjgXOAk4BPm9mrmbQXxwBnmdmlkgYADcvU7pxzzjWdFh2Wqpdm6ukpbHT4KPA/wk7LOwFXm9nbEBKBlqi3gaT7JE0kbEy4frz/AeAiSV9hYXDzIHCCpB8Bq5rZ7K6ccDb31g2z0lccOOecc92qzef0NFNPz2wzG529I+6oXO2VvQj4nJmNl3Q4sAOAmR0jaUvgM8A4SaPN7B+SHo733SLpKDOrmHi0EjMbA4wBuG+FfVvzHeCcc65ttGr6iHpppp6eUu4gZFxfFqDM8NaSwOsx19bBhTslrWFmD5vZScDbwMqSVgdeMLOzCVngu2VbBOecc871vKYOesxsMnAacI+k8cDvSxT7KfAwcBvw38z9v5E0MS45vxcYT0hqOikOo60DXFKubUmXEYbD1pb0iqQj6/CUnHPOuZ7jw1vNwcyGlrn/YuDiovtOyVw/DzivRL3Plzjc6fFSy/kcWEs555xzrmW0dxaK5u7pcc4555yrl6bp6ekJca7QHSUe2tnM3ml0+689tVRS+WU7FiS3MfbWtNwvAB1Ky+HTP8cmVVf/PO3l7WCl5DbKbuldxg4j0/OUpebSOvXRXyS38eDoo5PrDJ+f9l7pID1v07COjqTyM2em56xK9crsJZLrzJuZlhdrxpT034pzc/y8HDk/Ld9c6t8twLpLvp9U/sVpaZ9ZANM7+ieVHzsqLW8cwJNvpD33jyxI/yydMX1gep0+zdev0O4TmZsm6JHUAUwknNNTwGFmVjIToKRTgBlm9tuutBkDm9Eljr+ypKuBFQidgWPM7KyutOWcc871uDYPepopDG2mNBQLgO+b2brAVsA3JK3Xg+fjnHPOuS5qpqAnq0fTUJjZ62b2eLw+ndDz9NEGPVfnnHOue3TW8dKCmmZ4q6DZ0lBIGgVsQlgW75xzzrWsdp/T00w9PU2XhkLSUOAa4LtmNq1Lz84555xzPaqZgp7CnJ7RZvYtM5sH1JqG4ptmtiHwM2AQhDQUwInAyoQ0FMua2T+AvYDZhDQUO5U7aNzh+RrgUjO7tkwZz73lnHOudbT58FYzBT2l9Egaipjz66/AU2ZWahdoIOTeMrPNzWzzvYasnvMpOuecc93DOq1ul1bU1EFPD6ah2AY4BNgpTnoeJ2mPejwn55xzzvWMppnI3ExpKMzsfsixW5tzzjnXzFp0WKpemibocc4551xjmQc97aun01A455xzrvu0ddBTLg1FHtMsLb8MwPWk1fny0PRV83/vSMsrBPDFjplJ5WfOT3/ud/RPy32zZcfg5DY+v9orSeUnPz0iuY3b+rycVD5PHq3bxo1JrjN5s+8mlZ85Nz0v1tJLVNzxYTF3zls6uY3BiXMll1b6z9j3+qVNbXyjb/oEzhlKrzOtT9rHc+prBdBnWtrnw/L95iS38c6CtJxVyx+wYnIbb/8x7bNxqSXTn8f1s5dNrvP54W8l12k47+lpDj2Re6vCuQwiTH4eGM/najM7uRFtOeecc92l3Ye3mmn1VjPl3poL7GRmGxN6gnaTtFUPno9zzjnnuqiZgp6sns69ZWY2I97sHy+tuSmBc845V9DmmxM2zfBWQbPk3pLUF3iMEHz9ycw895ZzzrmW5sNbzaOpcm+ZWYeZjQZWAraQtEFXn6Bzzjnnek4zBT1NlXurwMzeB+4Gdit+LJt76+bZz9X4NJ1zzrmeYZ31u9RC0m6Snpb0nKTjSzx+cJxuMkHSfyRtnHlsSsysME7So/V4/s0U9JTSU7m3lisMiUkaDOzCoikugEVzb+02eM2uPE/nnHOu4boz6InTRP5EmLKyHnCgpPWKir0IbG9mGwE/B4r36NgxdoZs3uUnTxPO6ckys8mSCrm3OoAngMOLihVyb71EWPK+ZLz/N3GisgjB03jgeOBLkuYDbwCnlml6JHBx/AfrA1xpZjfW7Yk555xzvd8WwHNm9gKApMuBvYEnCwXM7D+Z8g8RppQ0TNMEPU2We2sCsEm1cs4551xLsfqllZR0NJDdcXWMmWV7aj4KZHdwfQXYssIhjwT+nbltwK2SDDi/6Ni5NE3Q45xzzrnGqufqrRiEVApESkVYJefpStqREPRsm7l7GzN7TdLywG2S/mtm9+Y+Ydo86PHcW84551zDvEJYTFSwEvBacSFJGwEXALtnv3vN7LX4/6mSriMMl3nQk1c9c28NpiO5zsGdc5PKDxyalq8K4IMZ6XVW2+qDpPLzcqSXOeKp5ZLKz2d+chupubT658jb9CNWSSo/fH76v0dqHi2A9R/7Q1L5Kzc6KbmNOxJzKq29IH1/z2GdaX9XfXPsIZr6b7LK/PThgTlKXzPSx9Kee57PoCX7pf1dvb8gPUdb/8R/k/Fnz6heqMh6O6V9Zp19/8jkNvbt915ynaXXSM/x1WjWWb/hrRo8AqwlaTXgVeAA4KBsAUmrANcCh5jZM5n7lwD6mNn0eP1TlJ+HW7NmX731IUmW3ZFZUj9Jb0lKnmAsabikr9f3DJ1zzrnm1p2rt8xsAfBN4BZCTs0r4wKlYyQVUk2dBCwLnFu0NH0EcL+k8cBY4F9mdnNXn38r9fTMJGxEODhuKrgrIXLMYzjwdeDcWitIEiCzdt/P0jnnnKuNmd0E3FR0358z148CjipR7wVg4+L7u6plenqifwOfidcPBC4rPCBpi7ix0RPx/2vH+0vl2zoDWCPe95tY7gcxh9cEST+L942S9JSkc4HHWXRs0jnnnGspZqrbpRW1WtBzOXCApEGEjQWz+bD+C2xnZpsQust+Ge8v5NsaDWxOmFh1PPB83PDoB5I+BaxFmCQ1GthM0nax/trAJWa2iZm91NBn55xzzjVQd+/I3GxaaXgLM5sgaRShl+emooeHETYUXIuwJK5/vP9B4CeSViIkJ302jFQt4lPx8kS8PZQQBP0PeMnMHqr3c3HOOedc92q1nh4I6SN+S2ZoK/o5cJeZbQB8loU5uGrJtyXg9EzurzXN7K/xsZnlTiSbe+vG2S907Vk555xzDWadqtulFbVi0HMhcKqZTSy6fxgLJzYfXrizTL6t6SxMVwFhZvmXJQ2NdT4aN0OqKJt7a8/Bq+d9Ps4551y3MKvfpRW1XNBjZq+Y2VklHvo1cLqkB4C+mfv3ByZJGgesQ5if8w7wgKRJkn5jZrcC/wAelDQRuJpFgyLnnHPOtbiWmdNTKjeXmd0N3B2vPwh8LPPwT+P9JfNtmdlBRbfPAkoFUxvkPWfnnHOumbTqsFS9tEzQ45xzzrmuafegp+WGt5xzzjnn8vCenjqZqb7VCxXZZMu0fDGfuGdWchsHDf5Icp0XHxqWVL4zxyZVwwel5R17a87g5DbWWvntpPL3vpaej2dER1ruoo6SSYcrmzk3Pd9Rai6t/Sakp7TZYePFNlGtaIn+Kya3MXBe2u+yATk2D5mf+G8yvE96Hjg6G/9R2ydH3rFpibm0hvebl9xGar6u2Tleqyn3Lzb7oaKt5qTnKXslxzTPuePTnsuyyS2ka9UJyPXSa3t6quXqkrSXpON77gydc8657tXuS9Z7c09PxVxdZnYDYQm7c84559pAr+3piSrl6jpc0h/j9S/G5evjJd0b7yuVs8s555xrWZ57q3erlKsr6yTg02a2MWH3Ziids8s555xrWe2ee6tXBz1mNgEYRelcXVkPABdJ+goLNzZ8EDhB0o+AVeMQmXPOOedaVK8OeqJyubo+ZGbHACcCKwPjJC1bS86ubO6tm2c915izd8455+qk01S3SyvqzROZCy4EPjCziZJ2KFVA0hpm9jDwsKTPAitLGkbM2RXzd20E3JmtZ2ZjgDEA/1zhwDZfCOicc67ZtepcnHrp9T09FXJ1Zf1G0kRJk4B7gfGUyNnV2DN1zjnnXCP12p6eGnJ1XQRcFK9/vsQhSubscs4551pVq+6vUy+9Nuhxzjnn3KJ8R2bnnHPOuTbgPT11MowFyXX2fTAtJ82423+c3MYrB/0+uc6V05dLKv++0vPYrNSRlqtsZaVvCjH21RWSyo8e/H5yGxPnpOUpG9aR/lotvUT6bgl3LBiYVD41jxbA3eMvSCr/+U2/ndzG0H7Dk8ov25Hedb+8peWTeplByW0MVPrP60GJG6HMJz3/X+qv3pc70nPgLae013e5pdJzDI6Zt1RS+VP2eje5jdNvS89juEJnWr6uTZJbSNfuw1tt39NTLUeXc84511v4knVXMUdXlqR+ZpbepeOcc841AV+y7qByjq5TJI2RdCu+bN0555xrWR70BNVydG0G7G1mB3X7mTnnnHN1Yla/SyvyoIeacnTdUCr3VjYNxQ2zXmjwWTrnnHNd0+5zejzoWahSjq6ZpSqY2Rgz29zMNt9ryOoNPTnnnHPOdY1PZF6oao4u55xzrpW1+0RmD3oiM3sFqJajyznnnGtZrToXp17aPuipIUfXKd17Rs4555xrhLYPepxzzrl20aoTkOvFg5466Ut6n+E1n5yfVH7X3X+d3Mb/G5lchV3eKzlvu6yRK32Q3MbMD9LSJMydk/5WnZy4Nf1rMxfr9Ktq06XTtrOfOTMt9QjAnfOWTq6z9oK09+MS/VdMbiM1rcS1j5+d3MZNG5yYVH5gYuoGgBmJ6Rs+NmBGchv9+6WnH5m/IO285iaWB5jXmVZneJ+0lBIA0zv6J5W/Z9YyyW18fam3ksqfcFv639Rpn3wzuc7429KfS6O1+5yetlm95ekmnHPOufbWTj09nm7COedcW2v34a226emJak43IWl9SWMljZM0QdJaPXHCzjnnXL1YHS+tqN2CnpR0E8cAZ5nZaGBz4JXuPFHnnHPO1Vc7DW9hZhMkjaK2dBMPAj+RtBJwrZk9202n6ZxzzjWED2+1n5rSTZjZP4C9gNnALZJ2Ki6czb11vefecs451+TMVLdLK2rHoOdC4FQzm1ipkKTVgRfM7GxCoLRRcZls7q29PfeWc84519TaangLktJN7A98SdJ84A3g1IaemHPOOddg6TtZ9S5t09NTLt2Eme0Zr59iZr/NPHa6ma1vZqPNbDczS9uFzjnnnGsyhup2qYWk3SQ9Lek5SceXeFySzo6PT5C0aa1182iboMc555xz3UdSX+BPwO7AesCBktYrKrY7sFa8HA2cl1A3WdsNbznnnHPtqrN7N9jZAnjOzF4AkHQ5sDfwZKbM3sAlZmbAQ5KGSxoJjKqhbjIPeupkrqV3mj1054ik8mcPmpXcxvw5c5PrvL8gLT/UW1OWT25jmNI2vM7z+i5PWhvKsd1WnpxgqQbn+JAa1pmW62ngvPTXd2i/4UnlU/NoAewx6RdJ5e9d/8fJbSw9YE5S+Xl5clzlqDO7I63OvMQcYpD+np/fkf4+Sa0xYkH6rJPn3knLpbWf0nOhPXbrssl15jThYEpnjcNSdfJR4OXM7VeALWso89Ea6yZrvn+RCiStJOl6Sc9Kel7SWZIGxMcui+OBx0paJ+6k/ISkNST9p6fP3TnnnOtNstu2xMvRxUVKVCuOtMuVqaVuspbp6ZEk4FrgPDPbO473jQFOk/Q74BNmtmosezxwvZmdHKt/og7tez4u55xzLa3WCcg1HctsDOF7uJxXgJUzt1cCXquxzIAa6iZrpZ6enYA5ZvY3ADPrAI4FvgzcCywfe3dOBr4LHCXpLgBJMwoHkfRDSRMljZd0RrxvDUk3S3pM0n2S1on3XyTp9/E4v+rG5+qcc87VXWcdLzV4BFhL0mpxVOYAwr53WTcAh8ZVXFsBH5jZ6zXWTdYyPT3A+sBj2TvMbJqk/wGHAf+IebIKvUIzskvQ4/27A58DtjSzWZKWiQ+NAY4xs2clbQmcSwiyAD4G7BKDLOecc87VwMwWSPomcAvQF7jQzCZLOiY+/mdCSqg9gOeAWcARlep29ZxaKegRpcfzyt1fyi7A38xsFoCZvStpKGH466oQKwEwMFPnKg94nHPO9Qb1HN6qqT2zmyjKdRmDncJ1A75Ra92uaqXhrcmEbOcfkrQUYcyv1qCkVIDUB3g/bkJYuKybeXwmZWQncd0423NvOeeca27dPLzVdFop6LkDGCLpUPhw46LfARcRusRqcSvwZUlD4jGWMbNpwIuSvhjvk6SNazlYNvfWnoM995ZzzjnXzFom6IldYPsAX5T0LPAMMAc4IeEYNxMmQj0qaRxwXHzoYOBISeMJPUp71/HUnXPOuabQ7j09rTSnBzN7GfhsiYemABtkyp1SVG9o5voZwBlFj78I7FaivcO7cr7OOedcM+nuOT3NpmV6epxzzjnnuqKlenqcc845l19ne3f0eNDTk5ZMzD81dc6Q5Dbm58j5kypPd2HqePDwAek5xN6eNzip/Gylv1Yr9E17Jq/MXiK5jaWVPnreN3G39gGW3sayHWmfngNztJGaS2u7yacnt/HyjscklX/j7SWT2+iw9G+a+Yl/WXlyx3VHV3/qeeWZK5L6PLor6WYzfsF2c+6tptPUw1uSOuIuy5Mk/VPS8Dof/yJJ+8br3y2s6nLOOedc79PUQQ8wO+6bswHwLmU2MKqT7wIe9DjnnOu1rI6XVtTsQU/Wg4RU80gaLemhmFX9OklLx/xZjxcKS1pL0mPx+kmSHok9RmOU2Xo5Pv5tYEXgLkl3STpS0pmZx78i6ffd8iydc865Bmn3JestEfTEjQh3ZmGysUuAH5nZRsBE4GQzex74QNLoWOYIwsaFAH80s4/HHqPBwJ7Z45vZ2YTsrTua2Y7A5cBekvpnjvW3Rjw355xzznWPZg96BsdNBN8BlgFukzQMGG5m98QyFwPbxesXAEfEIGl/4B/x/h0lPSxpIiGR6PqVGjWzmcCdwJ4x43p/M5tYx+flnHPOdbtOqW6XVtTsQc/smDl9VWAA1ef0XAPsTujJeczM3pE0iJA1fV8z2xD4CzCohrYvAA6nQi+P595yzjnXSnxOTwswsw+AbxPSRswC3pP0yfjwIcA9sdwcQhr681gYqBQCnLdjRvV9yzQzHfhwLaqZPUxIZnoQcFmZ8/LcW84551yLaMZtBEoysydibqwDgMOAP8cl5i8QemMKLgU+T0guipm9L+kvhLk/U4BHyjQxBvi3pNfjvB6AK4HRZvZevZ+Pc845191adQJyvTR10JPNmRVvZ/NubVWm2rbAhWbWkal3InBiieMfnrl+DnBOiWOdiXPOOdcL+I7MvYik64A1CJOVu3Kc4cBYYLyZ3VGHU3POOedcD+tVQY+Z7VOn47wPfKwex3LOOeeaRbunoehVQU9PshxvpNSx1aX6zktuY+iQ9JxVU6fVsrhtodQ8T3n0S8xxBTC/G/64h4+YlVR+3sxhyW281y99vcHw+Wl53fK8Vstb2vtxBum5zZYeMCepfGoeLYCV7/pzUvln1j8huY3uyCeVLwde2t9unjZSPxufHpjeykZz0p7HUn07qhcq8n7HgOQ6zTh/plVXXdVLS6zecs4555zrqqYLeiStIOlySc9LelLSTZJKDjVJGiVpUpnHLpC0XhfOY7ykkkvVnXPOuVbUqfpdWlFTDW/FnFjXAReb2QHxvtHACOCZlGOZ2VFdOI91CQHhdpKWiDs0O+eccy2tGYfculOz9fTsCMw3sw8H2c1sHPCEpDskPS5poqS9M3X6Sbo4Jh+9Ou7dg6S7JW0er8+QdFrsvXlI0ogq53EQ8HfCXj971fMJOuecc65nNFvQswHwWIn75wD7mNmmhMDod5lM6WsDY2Ly0WnA10vUXwJ4yMw2Bu4FvlLlPPYHriDsxHxg8rNwzjnnmpCnoWgNAn4paQJwO/BRwpAXwMtm9kC8/v8IGwoWmwfcGK8/Bowq25D0ceAtM3sJuAPYVNLSZcpmcm89n/iUnHPOue7V7nN6mi3omQxsVuL+g4HlgM1iAtI3WZhTqzjgLBWAzjezwv0dVJ7LdCCwjqQpwPPAUsAXShVcNPfWGhUO6Zxzzrme1mxBz53AQEkfDj/FnpdVgalmNl/SjvF2wSqSto7XDwTuz9u4pD7AF4GNzGyUmY0C9saHuJxzzvUCnXW8tKKmCnpib8w+wK5xyfpk4BTgJmBzSY8Sen3+m6n2FHBYHPpahpBhPa/tgFfN7NXMffcC60ka2YXjOueccz2u3YOeplqyDmBmrwH7lXho6xL3AZTci8fMdshcH5q5fjVwdZk6d1OUyDQmLvWAxznnXMuzFp2LUy9N1dPjnHPOOdcoTdfT010k/YQwfyfrKjM7Lc/x+iu9s2+lER8klR87dfnkNtbvSM/XNSCx43LZxPxIAGvukVbnrQeqlyk2d07aT5r5Sv8JNHTDtHw8M6ak/854o2/64tBV5qc9l+F95ie38TJpOdo+NmBGchvzFqTl63rj7SWT20jNpbXz5F8mt/GvDU5MrtPf0v7d07NJkSMbWvp7MfUd/yRp+ewAtlNaKy/b4OQ21hyY/v6dPi89X1ejteqwVL00XU9Pd6WhMLPTzGx00eU0SadIelXSOEn/lXRenODsnHPOtbR2n9PTVF/mmTQUd5vZGma2HnACC/fkqZmZHWVmT+Y8lTPj0vj1gA2B7XMexznnnHNNoqmCHponDUXBAMJ+QO/V5dk555xzPch3ZG4uzZKG4lhJ44DXgWdi4OWcc861NN+RuTV0WxqKqDC8tTywhKQD8p+6c84555pBswU9zZCGYuGBzOYDNxM2LVxMNvfWDbNeqOWQzjnnXI/xiczNpUfTUBSLQ2ifIOTgWkw299ZeQ1avV7POOedcQ3jQ00SaIA1FQWFOzyRCr9C5dTimc84553pQ021O2JNpKOLjpxACLeecc65XadVVV/XSdEGPc8455xqjVVdd1UvbBj31TkPhnHPOuebWtkFPDG7qFuB05ugznD0jLS9Lep4cGLJEeu6tJeeknde0HPllpLlJ5S3HC5z6es3N8Quo7/LD0trIMYtuhtKf+5zUzCmd6R8FAxPPq3+/9OxQqbm3OnKkkE6dkJknj9ZnJv0iuc7NG/wkuU6q1LdWH/J0E6Q18nbn7OQW4p60NZvRJ/15DBmS/ln63tyByXUarVkmIEtaBriCsIXMFGA/M3uvqMzKwCXACoRTH2NmZ8XHTiHsufdWLH6Cmd1Urd2mmsgM3Zd7q8o5HCppkqTJ8RyOy3Mc55xzrpk00Y7MxwN3mNlawB3xdrEFwPfNbF1gK+AbRd/rZ2ZyZ1YNeKDJgp5myL0laXfgu8CnzGx9YFMgLR26c8455yrZG7g4Xr8Y+FxxATN73cwej9enE1Zrf7QrjTZV0ENz5N76MXBcXEWGmc0xs7/U+4k655xz3a0Tq9uli0aY2esQghtCBoSyJI0CNgEeztz9zfjdf6GkpWtptNmCnmbIvVXuHJxzzrmWVs/NCbNZCeLl6Gxbkm6PU0WKL9mOi6okDQWuAb5rZtPi3ecBawCjCXkyf1fLsVplInMh99Z2hNe6Uu6tbwO/LapfnHtr18aernPOOde7mdkYYEyFx3cp95ikNyWNNLPXJY0EppYp158Q8FxqZtdmjv1mpsxfWPgdX1Gz9fQ0Q+6tcuewmGyU+8/ZnnvLOedcc2uiicw3AIfF64cB1xcXiCM6fwWeMrPfFz02MnNzH0IGhaqaLehphtxbpwO/lrRCbH+gpG+XKpjNvfXZwZ57yznnXHNrotxbZxBSTj1LGH05A0DSipIKK7G2AQ4BdpI0Ll72iI/9Os7xnUCY9nJsLY021fCWmZmkfYA/SDqeMJdnCiEtxNkx99Y4SufeOh94li7m3jKzm+JE59tjlGnAhV05pnPOOecWMrN3gJ1L3P8asEe8fj+U3hzKzA7J025TBT3Q87m3Ypm/AX+rdq7OOedcK/E0FM4555xrC3VYat7S2jbo8dxbzjnnXHtp26Cn7rm3cuSk6TcgLRdR/5npEfq8uen/xNM7+ieV78jx3J/9V1pOmgH90/M2pb5aQ3Lk95o99s3qhTJGzh9ZvVCRaX3S/w37WPrrlWqQpU1lnJ+YRwtgdkdanfk51mak1uhv6e+TPHm0dpuU9vF02/onJLeR+s5SN/QSrNV3qeQ60+alfQYNS3zvQr7P0pnKkzGxsdq7n6f5Vm/1eO4tSadIejXOEn9W0rV5c3g555xzzaSJVm/1iKYKepoh91ZUSGK2FiEL7J2Slst5LOecc841gaYKemiO3FuLMLMrgFuBg+rxBJ1zzrme0kS5t3pEswU9zZB7q5THgXUS6zjnnHNNpYl2ZO4RzRb0lFPIvTUBuJ3Kube2LVG/OPfWqBztO+ecc66FNVvQ0wy5t0rZhLDz8yKyubdu9NxbzjnnmpxPZG4uzZB7axGSvgB8Cris+LFs7q09PfeWc865JudzeppI7I3Zh5CE7HlJkwl5t24CNo+5tw6mdO6tCcAydDH3VnRsYck68CVgJzN7qw7Hdc4551wPabrNCXs695aZnUIItJxzzrlepTX7Z+qn6YIe55xzzjVGq87FqZe2DXo895ZzzjnXXto26Kl37i3rhlXt/XLk/Jk/Pz33S2ourQHd8Nvhg1mDqhcqkpojaTDp+aoWzE57rTqU/j4ZnKM/OvW59MnR6T2ftPfW3By5t+YltpEnN1TqxMbGZzULUnNp7Tr5l8lt3JUjX1ej9c3xWZr6bzgwx2fp3Byfpc3I2nyAq6kmMhc0Wf6twmV46nGcc865ZtLuS9abrqcnk3/rYjM7IN43mrAZ4TMpxzKzo7pwKmea2W+7UN8555xzTaQZe3qaLv+Wc8451xv4Pj3Np1nybx2bGdq6K88Tcc4555qJ595qHd2df+tMMxsdLzt26cydc8451+OaMehp1vxbi1k099bzXT2cc84511A+vNV8mi7/VjmL5t5aozuadM4553Jr99VbTRf0NGH+rcJlVB2O6Zxzzrke0nRL1sHzbznnnHON0O6bEzZl0OOcc865+mvVYal6aeugx/NvOeecc+2jrYOeeubfypPz54Npg5PKD8oRoz87e8nkOsMSswv1V/p5vTEv7bnneaP2T/w3GZjjefznmRWTyq+75PvJbfSZNiy5zpL95ieVn7ZgQHIbqRMC53Wm5y5K/bvKM0kxdRVKngxMyjGikPqez5NHa8fEfF33rv/j5DZSjbD0v/YBzE0q3y9Hfq9ZC/on1+mbI8dXo7X78FbTTWQuaML8W2ekHsM555xrJu2+eqspe3o8/5Zzzjnn6q1Ze3o8/5ZzzjlXZ51mdbu0omYNepox/9an8zwR55xzrll47q3W0pP5t25Z7GQWSUPxQuJTcc4557qXp6FoTi2Rf2vRNBSrd+VQzjnnnGuwZg16Wib/lnPOOdcqrI7/taKmDHqaKP+Wc84512v4kvUm1ST5t5xzzjnXSzRt0OOcc865+mrVCcj10vZBT73yb83OsTl9v460N9+7fbrnn6uvpXVcDuqblrYCYPaCtOeSpys1dexWOXIFDOpMO7MXpy2V3Mby/eYk13k/Ma3E8H7zktt4uSMtlcjwPultzO9o/Ah8egvp75M+OdIe5Eltkyo1rcR2k09PbuO+9Y9PKr9SWgYVAAb0Sfs7fO3D9S+1W3PA9OQ6c+ek/Y10h1adi1MvbR/01DP/lnPOOeeaV9NNZO7pnFux7pfizs6T4+7NF0ganudYzjnnXLPwicxNpBlybknaDTgW2N3MXpXUFzgsnsP7eY7pnHPONQNr0fQR9dJsPT3NkHPrJ8BxZvZqbL/DzC40s6fr/WSdc865diRpGUm3SXo2/n/pMuWmxO/9cXG7mqT6xZot6GmGnFvrA4/nPH/nnHOuaTVRGorjgTvMbC3gjni7nB1jOqjNc9b/ULMFPeV0d86t0Ki0YYwun5e0f4nHP8y9dfPs52p/Ns4551wPaKI5PXsDF8frFwOf6476zRb0NEPOrcnApgBmNjG2929gsbWH2dxbuw1es8IhnXPOOZcxwsxeB4j/X75MOQNulfSYpKNz1F9EswU9zZBz63Tgt5JWytzXfJstOOecc4nqmXsrO9oRL9mgBEm3S5pU4rJ3ufMrYZs4tWV34BuStuvK82+q1VtmZpL2Af4g6XjCXJ4phLxbZ8dJTOMonXPrfOBZuphzy8xukrQc8O+4cut9YBJwS1eO65xzzvW0eu7IbGZjgDEVHt+l3GOS3pQ00sxelzQSmFrmGK/F/0+VdB2wBWFubk31izVV0AM9n3MrlrmYhWOFzjnnnKuvGwjbwZwR/399cQFJSwB9zGx6vP4p4NRa65fSdEGPc8455xqjifbpOQO4UtKRwP+I6aAkrQhcYGZ7EBYsXRcXa/cD/mFmN1eqX42a6AXoVvXKuVVw64gDkl/I1NnvS2hBahO5Jm3NsvQ8Yqn6JnaxduTIXZT63PsrfT3CgD5pecemd/RPbiPPc++f+PrmWYkxSGnPfU6O91Vy/rQcXfeW4/VtV3le309OPiOp/M0b/CS5jUGp+QIT37sAsy29jyD1c27nN69o+Jvx0yvvXrcv/Vte/nfL/fG0bU+P59xyzjnn2kuzrd4Cejb/lqSfxL15xknqyFz/dp7n4pxzzjWLeq7eakVN19PT0/m3sj1AkmbEfXqcc865llfP1VutqBl7epoh/5ZzzjnneplmDHqaIf+Wc8451+uYWd0uragZg55yeiT/VsUTyuxGedPs57t6OOecc66hmijhaI9oxqCnGfJv1SSbe2uPwWt09XDOOeeca6BmDHqaIf+Wc8451+u0++qtpgt6Ym/MPsCuccn6ZELurZuAzWP+rYMpnX9rArAMXcy/5ZxzzvVGnWZ1u7SipluyDs2Rf6u4jnPOOedaW1MGPc4555yrv9bsn6mftg566pl/q1+O7EU3D07LRXTkoJnJbVw2e5nkOjvMmZdUfhbpOZXOGjgjqfyWGp7cxn6D302uk2rb119IKj921CrJbSx/wIrJdcafnfb6zu5M/yhYbqlZSeXvmZX+XhyxIO3vKk8OsacHpo3yP0na8wZ4u3N2cp21+i6VVL5vjhxiIxLzSa00P7mJ5Fxau01Kzw509/o/Tiq/0ogPktu49r30rd2260j/zG60Vl11VS9tHfR4/i3nnHOufTTdROaezLsV610kad+i+9J+NjvnnHNNqN336Wmqnp6ezrvlnHPO9WatupNyvTRbT4/n3XLOOedcQzRb0ON5t5xzzrkGaffhrWYLesrpzrxbpf4lS/7rZnNv3Tg7bRWPc8451918R+bm0gx5t94Bli7ckLQM8HapgtncW3sOXr3CIZ1zzjnX05ot6GmGvFt3A/tLGhBvHw7c1cVjOueccz3OzOp2aUVNtXrLzEzSPsAfJB1PmMszhZB76+yYd2scpfNunQ88SxfzbpnZjZI2Ax6T1AE8DxzTlWM655xzzaBV5+LUS1MFPdAcebfM7GfAz6qdq3POOedaR9MFPc4555xrjFYdlqoXtesLUM+8WwA3jzgg+YUcoo6k8uP7D0xtgs70dDx89Z8HJZW3D6Ymt/He8RcnlR/3fPrWSjP7pOUEW2vA9OQ23pgzJKl8R478SMv3m5NcZ60d0nILTbl/aPVCRS5R2nP/+pD3ktt47p2lqxfKyDNJcX7iv8lwpSegktI/Z6d19k8qn+e5DyDtM2hAn/TsZjNz5HVLtcPk05PKr79uqcGEyh7caonkOkv8MG2P3EGfPCTHJ3aajVf4RN2+9Me/8Z+Gn2+9NfzdGOfFTMzc9Tkzm9KF4+0FrGdmZ0g6BZhhZr+tUH5P4OeEz4T+wFlmdj5hldbvzeySvOfinHPOudbRHcNbs+My87owsxuAG2opK6k/MAbYwsxekTSQuEdPdtdn55xzrh206v469dLtS9YlDS2VUiImD/1vTBQ6SdKlknaR9ICkZyVtEcsdLumPRcdcQ9LjmdtrSXoMWJIQ2L0DYGZzzezpWOYUScdJWlHSuMylQ9KqkpaTdI2kR+Jlm256iZxzzrmG6DSr26UVdUdPz2BJ4+L1FwnzaPYxs2mSPgI8JKnQc7NmfPxo4BHgIMIOy3sBJwCfK9WAmT0v6QNJo2OuriOAi8zs3XjslyTdQdiV+TIz68zUfQ0YDSDpG8D2ZvaSpH8AZ5rZ/ZJWAW4B1q3LK+Kcc865btftw1txyOmXkrYDOlk0pcSLZjYxlpsM3BH37plI5dQRABcAR0j6HrA/sAWEbOuSNgR2AY4DdiVsOLiI2JNzFPDJeNcuwHoLU3yxlKQlzSx9tqtzzjnXBNp9eKsnlqxnU0rMlzSFhSkl5mbKdWZud1L9XK8BTibs6vyYmb1TeCAGUhMl/Z3Q23R4tqKkkcBfgb3MbEa8uw+wtZnNLtegpKMJvVJ8a8nN2WPwGlVO0TnnnOs5rTosVS89kYZiGOVTSuRmZnMIQ1DnAX+DD+cP7ZApNhp4KVsv9jxdCfzIzJ7JPHQr8M1MudEl2vww95YHPM4551xz64mg51Jg85hS4mAWTSlRj2MbIWCBkJ39h5KejvOKfsbiQ1ufAD4O/CwzmXlF4NvxPCdIehJPReGcc67FtXuW9YYPb2VTQMTbb1M+pcQGmXKHZ65PKTxmZhcBF8XrpxTV3xa40Mw64uPTgT3KnFe27qBSZQhzg5xzzrleod2Ht3pNGgpJ1wFrADv19Lk455xzrvn0mqDHzPbp6XNwzjnnmlmrDkvVS68JenraklqQXGfsgHKjaqUdsv7LyW1MfSY9p9KOe/wmqfwQpeUIAtim34pJ5dfum57iZdMl3k0q/9b09Nw6U/ul/Ql9ZEH6+2SpJdNzb519/8ik8lvNScvBBHDKXmmv7wm3peXRAtgvMT9dZ47P86X6prXxsg1ObmNGn/T37zBLy3M1MMewRb/EvGOvlZ0JUN4Iza1eKGOlEWl54yA9l9bkp65MbmPwip+sXqjIdyfelFT+t1MOSW4jVbsPb1WdyBx3KM7uWDyqKw1K2kvS8fH6KZKOy3GMPSU9IWm8pCclfTXef4ykQ7twblPihonOOedcr+MTmavrsdxZpXg+Leecc87lkbxkvZtzZ5VSNZ9WvH63pF9JGivpGUmfjPcPkXRlXIp+haSHJW1e4nl+KdYdJ+l8SX1TXyvnnHOumZh11u3SimoJegZnhrauA+YQcmdtCuwI/E4LczWsCZwFbASsw8LcWccRcmeVZGbPAx9kNgA8grgsvUTZdwk9RS9JukzSwZLKPY9+ZrYF8F3Cbs0AXwfeM7ONgJ8DmxVXkrQuYbn6NrGXq4Owp5BzzjnXsjqxul1aUfLwVnfnziql1nxawLXx/49l2t+WEJhhZpMkTShRb2dCMPRIjOcGA1OrnL9zzjnnmlie1VvdnjurlGr5tIrOpyPTfi3LFQRcbGY/rlgok3vrB0tuwt5DVq/h0M4551zPMF+9lazbcmeVUks+rSruB/aLx1oP2LBEmTuAfSUtH8stI2mx55nNveUBj3POuWbXLMNb8Xv1tjjn9zZJi+1pIWntotXj0yR9Nz52iqRXM4+VzL5QLE/Q0525s0qpJZ9WJecCy8VhrR8BE4BFNoYwsyeBE4FbY7nbgLSNT5xzzjlXzvGEKTBrEToaji8uYGZPm9noOMVmM2AWcF2myJmFx82spk2Rqg5v9WTurDLnU1M+LTPboeicR8Wbc4AvmdkcSWsQXuyXYrlRmTpXAFeUOw/nnHOu1TTR8NbewA7x+sXA3YSOiHJ2Bp43s5SRncU0zY7M3Zg7awhwV5yQLeBrZjavwW0655xzPa6JdmQeYWavA5jZ64XpJBUcAFxWdN8344bEjwLfN7P3qjXaNEFPqdxZMRBarejuH5nZLV1oZzqw2L48zjnnnKtddjFPNMbMxmQevx1YoUTVnyS2MwDYC8guLjqPsO2Mxf//DvhytWM1TdBTSislEZ1r6dOjDlk3LZfWeU+ulNzGZjlyKv3fejPSKuToKJs7442k8vPnpL9VH3hvuaTyS5G+2da2y6TtZDBj+sDkNq6fvWxynX37Vf3Bs4hXWDK5jdNvS8vYcton30xu47Fb0597qvc7BiSVX3Ng4t8HMGRI+t/IvLlp7/m589P3T521IC1v3poDpie3MXXOkKTy1743onqhIg9ulfb65smjNfu1+5LrnL/JScl1Gq2e6SNigDOmwuO7lHtM0puSRsZenpFU3hZmd+BxM/vwQyR7XdJfgBtrOeekb+pWysPVVXFH583jdc/J5ZxzruWZWd0uXXQDcFi8fhhwfYWyB1I0tBUDpYJ9gEm1NJr687ll8nA555xzrmmdAVwp6Ujgf8AXASStCFxgZnvE20MIGxAXd2j8OmZxMGBKicdL6tLwlqShhOhsaaA/cKKZXR97gG4m7ImzFTCesPfOz4DlgYPNbKykw4HNzeybmWOuAVwV01wgaS3gcjNbLF0EJfJwAYU8XBcBswnpMFYlpLY4jLDy7OHC6jJJ5wEfJ+y6fLWZnYxzzjnXCzVL+oi4AfHOJe5/jcwKbTObBSw2zm1mh+RpN3UiSqvl4VqasBrsWOCfwJnA+sCGmeP/xMw2j+e5vaSNan0xnHPOuVbSRMNbPSI16Jmd2QhoH8KS71/GDfxup0QeLgupWD/MwwWk5OHqS8jD9Y9yBc3sKEK0OJYQUF2YefifmTbfLDqfwjnsp5Dh/QlCQLReDa+Dc84551pMnh2Zs7J5uEYDb1K/PFy7A3tSYx4uMzuTMO73hcxD2TaLz6efpNUIgdLOFrKu/ytz/lVJOlrSo5IevXH2C7VWc84553pEp1ndLq2oq0FPq+fhWgqYSRhOG0EItFLO88PcW3sO9txbzjnnmlu7D291dZ+eS4F/xjxc46h/Hq7PU1servMJk5ZnkpCHy8zGS3qCMNz1AvBA7rN1zjnnXFNLCnqstfJwlWyzxGOHU4ItmrtrVLlzcM4551pFs6ze6ilNuSNzN+bhcs4559pGqw5L1UtTBj3dlYfLOeecc+1D7R711cv/rXBQ8gs5rW/aPPIhnen/Vu/0VfVCRQ49O3HV/nvvJrfx+h8mJJV/5O20PFoAS3em5R1bYfDM5DZemJOWs2pGn/S1A1sNfyu5ztJrzEkq/7/xw5PbuDcxX9cm8+ZWL1RkhqXlk8rzK25BYvmhSs9nt8DS/w5nKj2XVqq+iZ///XMMjaS+45fql56nbMPLP59U/sRDbkpuY1RH+r/HV584Nal8/4+snv5GSTR0yGp1+9KfMevFhp9vvfWG3Fsf5shyzjnnXHlWx/9aUUvn3uoKSX0rTZJ2zjnnXO/SpX164j45d0h6XNJESXvH+0dJ+q+kCyRNknSppF0kPSDpWUlbxHKHS/pj0THXiDskF26vJemxxPMaJem+eF6PS/pEvH8HSXdJ+gcwUVIfSedKmizpRkk3Sdo3lt1M0j2SHpN0S1FGV+ecc67ltPvmhKk9PYMljYvXXyRkRd3HzKZJ+gjwkKRCz82a8fGjgUdYmHtrL0Lurc+VasDMnpf0gaTRZjaOCrm3KpgK7Gpmc2LC0suAwhDYFsAGZvZiDHBGARsSEqE+BVwYs7efA+xtZm9J2h84Dfhy4nk455xzTaPd5/F2aXgrBge/lLQdIbXDYrm3YrkPc29JSsm99T1C7q0tEs+zP/DHmFS0A/hY5rGxZvZivL4tIaN7J/CGpLvi/WsT9vW5LeZP7Qu8nngOzjnnnGsiXV2yns29NV/SFOqXe+tk4E5qyL1VwrGEPGAbE4bwsktZskt0ys08FzDZzMptvBgKSUcTerL42pIf51ND1kw8Teecc677tOoE5Hpp6dxbVc7r9diDcwihp6aU+4EvxLk9I4Ad4v1PA8tJ2hpCj5ak9Uuc54e5tzzgcc451+zaPfdWV4OeS4HNY+6tg6l/7i2jcu6tgn9JeiVergLOBQ6T9BBhaKvcBizXAK8Ak4DzgYeBD8xsHrAv8CtJ4wl5xT7RlSfjnHPOuZ7V0rm3Yr0dyjy0Ueb6j2PZu4G7M3U7JR1nZjMkLQuMBSbGx8YB21Vq2znnnGslrdpDUy9NmYaim3Nv3ShpODAA+LmZvdENbTrnnHPdrr1DniYNeroz91aFniLnnHPO9Sb1nNTkl7KTvY5uZHlvo7FtNOt5eRutf17eRuufV3c9d7/U59LVicyuNkc3uLy30Xx1vI3maiNPHW+judrIU6e3tOHqxIMe55xzzrUFD3qcc8451xY86OkeYxpc3ttovjreRnO1kaeOt9FcbeSp01vacHWiOKnKOeecc65X854e55xzzrUFD3qcc8451xY86HGuF1OwcoPb6Cvp/3VDG79pZBsV2h7RE+3mIWmpCo+t0p3nUtT2N3ugzSW6u03X/DzoqTNJ50g6u9ylju0cWXS7r6STK5QfIemvkv4db69XfIwy9VaQtJekz0paoYbyAyUdJOkESScVLjXU21bSEfH6cpKKd98ulPu0pH1L3H+wpF0rHH8XSd+Ol4rJYyV9RdJa8bok/U3SNEkTJG1a7bmUON4RZe5fR9LOkoYW3b9bhWNtIenj8fp6kr4naY9y5S1M2vu/xPNdQ9LAeH2H+JoNr9BGB7CcpAENbmMzSaq1jXjs30paP6VOrDdM0pcl3Q48XqHc9pI2itf3k/RHSccWnltR2e+V+puT9C1J363QxrKxzJ/i5ZsxV2Apd2fq3VH02P+VOf4vM9fL/g1lyixV+PuIt78o6dB4KRcgfrnacetF0ickPQk8FW9vLOncKnUk6UuFzypJq0jaokzZZSpdKrSR6zPY1ZcHPfX3KPAYMAjYFHg2XkYDiyVPlTQ9fqGWvFRoZ2dJN0kaKWkD4CFgyQrlLwJuAVaMt58BvlvpiUg6ipCE9fOErPMPSar24XU9sDewgJDdvnCp1M7JwI+IiWGB/kC5noOfAfeUuP8O4NQSx15Z0uPAT4FRhFQmp0u6OQZoR5U41neAKfH6gYTktasB3wPOqvRcKpxz8Xl9m/BafQuYJGnvzMO/LC4f65wMnA2cJ+l04I/AUOB4ST+p0P5DhUCpRtcAHZLWBP5KeO7/qFJnCvCApJ/GL/fvSfpendt4Arhe0iGSPl+4VKnzX2CMpIclHSNpWLmCkgZL2l/S9cAk4PfAL4CSPWWS/hQfv0Chp+ugWG8T4MISVb4M/L3E/WMoExRIWjceczPC3+yzwMeBiZLWKVUlc734C7hcwJgNsn9VpkzWb4FtMrdPj+e0HSXe63mV+Gz8QNLzki6oEPQBnAl8GngHwMzGUz159LmE5NkHxtvTgT+VKfsYCz/niy+PVmjjIhI/g10D9PSW0L31AtwF9M/c7g/cVaH8qcDXCYHLUsDXgB9WaWN/4G3gf8A2Vco+Ev//ROa+cVXqPA0sm7m9LPB0lTqTcrxW4wgfyNlzm1CmbMn7yz0G3AAcXuL+Qwm/4B8vdT6Z6/8AvpO5vVj5QttlLhOBuSXKTwSGxuujCB+W3yn+NypRpy8wBJgGLBXvH1zldXmSEHA/nzmnSuUfj///AfCtSueUqXNyqUud2/hbicuFNb7H1gbOAF6K/6Y7Fj1+KfAyIQDbNb7OL1Y55pPx/4MIX7B9420BE0v9+1U4VsnHgKuB/Urc/wXgmnKva6n3aoX3btk6Zco/QVz5W/zvBtxfps6C+J4tvkwHptXybxiPszRwLHBVhTIPlziv8VWO+3hqndQLOT6D/VL/S1MmHO0lViQEMO/G20NZGOGX8mkz2zJz+zxJDwO/LlU4di9/h/CLeV3gEElPmNmsMsefGX8dWay/FfBBlefwCuFDqWA64Yuhkv9I2tDMJlYplzXPzExS4dwqjcUPktTPzBZk75TUn/DlX2wdM7uo+E4zuyR265caruqUNBJ4D9gZOC3zWKk2AEYQfl2+V3S/gP+UKN/XzGbEc5kiaQfgakmrUv4X+QILwzyzJD1vZtNi/dmSOsvUAdi9wmOlzJd0IHAY8Nl4X/9KFcws9Rd+njZKDhNWI6kvsE68vA2MB74n6atmdkAstgHh3+4p4L9m1lF4P1YwJ57XHEkvxX8b4nt5fplzGWFmbxbfV6GNDc1sseFcM7smOyyVsXzsYVPmOvH2cmXaKFen0Nbvi8r3s/iNHR2SuT68TBsTzWyTMo/VzMzeA86UdEiFYi8rDGGbwpDrt4lDXRXMj++TwmfQckDJvylVGeI2s3LDoXk+g12dedDTOGcAT0i6K97eHjilQvkOSQcDlxP+KA6kxHBYxj+Bb5rZ7ZJEGHp5BCg3f+F7hF6PNSQ9QPgAXOzDtMirwMOxu98Iw1ZjCx+K2Q9DSRNjmX7AEZJeAOYSPkjNzDaq0M6Vks4Hhkv6CqGr/y9lyl4L/EXSN81sZmx7CcKwz7UlypccwpXUB5htZlNLPHwSoeelL3CDmU2OdbYHXihzXjcSem7GlWjr7hLl35A0ulDezGZI2pMwLLJhmTbmSRoSA9vNMscfRpkP6HjslyRtC6xlZn+LH+hDy5UHjgCOAU4zsxcV5leVHG6UdEOF42Bme3W1jUxbHwPOA0aY2QYKc2n2MrNfVKjze0JQdSfwSzMbGx/6laSnM+e5cRwuOgi4XdJUYElJK5jZG2UOnxpg/Ab4l6Tvs3Ce0GaEHza/LdNGpaHhUo/9hYXD3NnrABeUOU6lOqV0Zl8XM5sEIOmjVHgf1kv8gVPpu+sYwjD0Rwk/3G4FvlHlsGcD1xH+HU8jfDaeWKbs7yocx4CdyjyW5zPY1ZlvTthAChN/C703D1f48ETSKMIf6jaEP5wHgO+a2ZQy5Zcq/NLP3LeWmT1boY1+hG5+EYapSv4azZQvOzEaFv11H3soKpV9qUwbAlYi/Ar/VDy3W8zstgrP4RfAUYShCoBVCMMSPy1+TpLOJHzBf7coSDqTEPR8p0I7S8ZflmTqqdBDI2nXcudZjqSlzew9SSsRem4We09I2sbMHsiWj9cHmtncEuU/Aows9K5l68TbJwObA2ub2cckrUgYHtim+FilzhdY2cwmlHn8LULv32XAwxT1UpnZYvOv4i/qi83sS9XaL6p3D2E47PxCr4GkSWa2QYU6XwYuL9UDKmmYmZX8pS1pc8IPjy8Cr5jZYpPfU/4+MnV2B44n9CwZMBk4w8z+XeY8XiHMLVrsIcJ7OtfKPEk/NrPT89SR9CVCL/P3CUNdEHpMfwucbWaLzVuSdIKZlZyrVu68VHq+1tKEYf37zWyxOXyx3spm9nLRfZWC10KZdQg9uwLuMLNqvUPJUj+DXf150FNnXej6TG1nBGHC60fNbDdJ6wFbm9lfy5Qv9QHyAaHbuVRvR3H9pYH3rcobJnbZTjaz6fH2ksB6ZvZwhTqPmdlm5R4vU2cwsGa8+ZyZzS56fFczuy3+KjwdOJwQJBmwKnAxcIKZzUtpt6iNx80saTVXap16tCFpHGFy7eOZYGFCud632DO1F+HX9DjgLeAeM1tsYnIMYHZl4YTvfwGXFXrHKpzjLcBnU15/SY+Y2ccVhnELz2OcmY2uUOcOM9u52n0V6gvYrhC8dSVYyFM+T2BVYxtdel8prDA8gdCzXDV4y9nG34oeNsLcqbvN7F8VjrEAuAr4cuFzodzzVYXVVgBm9m6lxxUWkaxHmNdVqHNJmbJd+gx2dWJNMLGoN10IE5jLXe6sUO9jhBVIk+LtjYATK5T/N7AfcbId4Quq0kTJfxHmF10TL+/E+54FDikqexJhLgzAQMLQwLvAVGCXKs+/eJJjH6pMjiSskvh4nf8diidxDiYMG20EDClRftccbTzR6Dr1aAMYm31NgCWoPJH5ifj/o4Cfxetly2fqDSQEl28RJydXKHs+YTj2p4Ru/+8B36tS59/AGpnnsS/w7zJlBxFWL40n9A4sEy+jgKfq9b5qRJ2cbfy4u99X9T6nLpzXj4uPQVgU8hiwRqXjAi8ShqxfzFwKt1+o0u7JhM/1NwmT6t8Arq5QvubPYL807uJzeurMzHaM80W2tjhEUaO/ELvu43EmSPoHYSinlI+Y2ZWSfhzLL5BUaQ5QJ7CuxUmUsafoPMLw270supR2f+Dn8fphhMBlOUJgdjFwe4V2ZPEvPJ5XZ+zSrWRH4KuSXiLMU6hlHlA1xcMsswmrlsr5FZA0VEWckNjgOvVoo9ScqXLzOwD6KUzk3g+otBQeCMNuwGcIvT2jKD+/Kuu1eOlD9TkkBd8gLO9eR9KrhC+mckNkXyUsB16RRffZmUb5pci1SNonKGedPG18kdCjWavueO+mnlOeNkq1Y2Z2rqTxwD8l/ajccc2s5H5gNdoX2JgQUB0RP1Mr/V2lfAa7BvGgpwHiF/1vCfs+1GqImY3VonuvLShXmPSVAKNs0VUjU4GPmdm7WnylybxM4PJpwnBFB/BUDQHMCwp70JwXb3+d8pN/C1JXF9Ui9cMzzxdNSzCz3ypsOjeNMJ/gJKs8F+lUwn4i95vZI5JWJ/waXYykiwnzU/5N6BWaVOM5JQ/LmNkLwC5xblUfi0OoZcqeBZwl6Vtmdk5qW5VOoxvq5GmjOwKrZmyjVB0BmNkDknYGriDMGSx/gNLTEj4AXrKilaIZs+Nn/QKFnbCnAqtXaCblM9g1iAc9jXOrpC8A12Z7Pip4W9IaLAxi9gVer1A+dSXAfZJuJIx1Q9jn4974BfJ+Udm5caz6TUIvzHGZx4ZUeR7HEH7pnxifyx3A0ZUqWJzkLGl5MmPj3SzPF82UHHW6/YtD0q/M7EdkerIy9y3GzK5i4fukEGx8oUxbhxB65z4GfDsTtBd66xZJi6D8q71QWKL9azN7P95eGvi+mS22yiYzf+LVUnMpzKxaT1TZ0+iGOnnaSH3/XlW9SJfr5PmbynNexe18uEO5mb0uaSeg4i7shM0JNyXsYyXCUPh4YFlJx5jZrSXqPKqwi/hfCENpMwibuZaT8hnsGsQnMjeIpOmEuRMdwGzKfAlkyq9O6Lr/BGG/kBeBg61o1ZPCzrovm9kbsdflq4Q/nicJv+BLTryLEzI/D2wb73qHsOJnsaWckrYkDGMtB/zBzH4e79+DMPZ8YHGd+HjeVTl7EZaBrkj49bMqYd5FcvqAzDGvNbNqu/Vmy2cnUFasV+kLMwaur5jZXIW9dzYCLsl8US+T/TdKLZ+zjcUmcZaayCzph2b2a0nnUOILy8y+XeFlqYlyrPbK1H3CivZ6qTBBtXgSbFEzlistgmpchdSVOjnbWOS1UdiW4CuE4cYPf9xWet556qScUyPayLYj6Utm9v9UZidwW3y/oewxLgd+bgu3p1iPMN3g54QfrqOrnMMowmahJVc5Zsp9gfAZLOB+wgaT/iXcjbynp0HMrNZ5CgUvmVktXffnA7vE658gzLn4FiHNxRjK9PaYmUl6njB+vB8hqLqmTNmHKdEdbGY3ATeVewIWNnRbTtIAS1sV9XNgK+D2+OG1Iwu3g19ErQFJSsATTclcL2yWtzzhNb4z3t6RkNuoUi/BNcDmWphe4QbCDsB7xPMqDkpTy9dcR9LXCMOLq0vKfhgvSdgSoVhhiW6lrfS7agUWrvY6iBpXe0V9lVm2r7CCb7EcV9CljQwrfimXCkZS6+RpowbFPSTXA/cR5t9VmuvX1Top59SINrLtFDY1Tf3shbBw48P3oJk9KWkTM3tBFdK9KewVNYr47yhpzVI/iuI8zwkWtlco+bnruof39DRI7Fk5GFjNzH6ukOl6pC3cHK24/P+Amwnjz3eWi/4ljTezjeP1PwFvmdkp8fa44l8kChu6HUD4knknHv84M6u4r06suyxhhcK2hF/+9wOnmtk7FeqcT+gmvoHM5mlVfmU9amabx4mHm8Rx8rFmtljCv8wv+JIBSXGw08VemxuBr5jZ6/H2SOBPlQKqQs+DpB8Ac8zsnFK/ePOWT6mjsGnh0oRJnsdnHpperkewOylMgD6QsGnfqVZl7o2kHxKW0v+N8H78MmHzyJK7lmfqfYawtDq7rLjcHi//IXwpP0bmS9nMyn5RpdbJ2UZSD0mpz4JqUuvk7E3Kc1517x0q0cYVhJVVl8e79gc+Qhi+vd/MFstdJ+lCQi/rZBZuyli2F1HSpYSVZv+r13m7dN7T0zjnEv4QdiL0ZMwgLs0uU35tQg/DN4C/xi/cy83s/qJyfbUwDcPOLDpfptS/538JH7CfNbPnACQdW+NzuJywqqAwn+NgQtC0S9ka+VblvK+Qafxe4FKF3XBLTh4s/IKPr896xQFJiSpd6bUZVTh+9CZh7kolqekVktMx1FrHwsZ7H0g6EXgjOxwm6cPhsAJ1Yb5NCuVb7UUcepvIwg3kfm5mt1Rp68+EeWg7ElbW7EvleRdDrMxcpzrWydNGag/JjZL2iL2ztUqtk6fXJs951dSOwsrEu83s2fij86+Ez66XgMPM7IlydQlbLXydsOKvMPR0HDCf8N4pZSszWy/heYwEJksay6I/COvyd+VqZE2wbr43XuhCAjvCr/NLgI4Sj/2EMDRxPZk9cQgb9T1Qovw+hEDlZcKEu52pkkgxU/exEvc9WsfXaJX4/yUIQVI/whf5t8kkOi1Td1LR7T7F9xU9fiOhp61weyRhrL5SG38krGI6PJ7Xv4FzqtRZj/AlfmC8vRpwfL3K52xjXHxt1yQkHT0TuKlEubcIy7t/QMhKvX32Uqd/84sJPRy/ADao13upQnsTiv4/FLi1QvlfAHsktpFUJ2cb4xLLTyf86JpNjYk9U+uknlMXzqumdgjZ6PvH6wfF99myhB9p9zXgvfVXwg+vWstvX+pS7/PyS+WLD281iEKy0E8QMutuGrtob7XKwxbbE7pVdyds3HaFlejyVliePjIer5Ba4WOE3E8ld3yOc4U+R/h1vRPhy+c6K70qoVDnt4T5HVfGu/YF1jezkyvUWQ74IYsPJyyWj0aLTh6+xszKrRAq1c4fgbUIE2KNMIT3nJl9q0z5RdIVFI2xV2pnH0IAAHCvmV2XcI4VUzh0tXytdTLDYT8kLLMtNxyWa3flFAqJUQu/crMfPmUn+ku638y2VVgcUFOdTN2HzWxLSQ8RJvK/QwiO1ypTvrAAYS7hV34tbSTVydnGL4D/WFoPSUN11znV2k526Exhj7OHLWxdUHbCe6buNoTciKuy6BBa2SXokrYj5EB8g9rzDLqe1tNRV2+9EIaCbiAkvDsNeBr4YoXyLxIS3h0ILNHgc1uGsOqr5A7RxF9fLPxVNj9eOqn+q+xW4EjCpNjtCQk0f1Wm7BOlric8j30IvRZnAvtUKZvcaxPrrUrchZowTLJklfJ3A0vF1/h/hF+bv69X+ZxtPBzfV5MIc8ygQq9YfLzm3ZUbfQFW70LdnxIyf3+B8OX0OmH+UI89n5zPo6YeEhbupL5pqUuZYyfXSTmnrrSR+NwfJ/wYHEQYil4/81jFXbgJ0wB2JwyDL1u4VKnzHGGO2Wrxc2JVYNUK5bci/JidAcwjDNVV/Dz1S/0v3tPTQEpIYKcSCURbkWIeLWWWREu6x8y2L1E229OTJxfQqoTM4bdLGgL0tQob1qX22sQ5AkcDy5jZGpLWAv5sFfI2aeHy2aMIPTAnq3Keq6TyOdtYj7B/0oNmdplCRvP9zeyMEmWL59vcAFxoZq+WO59Gy7ynas6ZVeY4A4FBViLJqKR1zOy/KpM7z0r0oKbWydNGKkljzOxoSXeVbqJkj2tyne44rxxt7ElY3doX+KeZfSXevz3wQzP7TIW6D5vZluUeL1PnzpTzlvQooUf6KkIC4EMJn18npLTrusaDngZR6UR2023xLOAN3xslVVc+nCU9ZGZbKSSUPJswqflqM1ujRNkOFqadGAwUMmHX0t2fJyBJDZLGAVsQuskLCS4nmtmGFepMJGSLvxj4iYUdjSsFJEnl89aphRbdXflyq3F35UaT9ATwf4RcYGcWP25VVgYSVnv9wzKZ50uUa3iwkLONhgdKqbrrnHIGov0IvbHvZe5bgvBdN6NCW2cQgqVrCUNVZdvI1DmX0Iv4z6I6JSfla+Eq1ewPwv+YWbWNE10d+eqtxnkcWJmw0aAIfxyvK6xM+oqZPRbLdcfeKKm+Rwgofpe5LxuQVfp18wuFpdLfB84hDMOUXC1mZn27cI7fIAYk8VjPKuzoXFI2SCIkrfwo8GdCT1w5c81snuI+HfEDtdqvhJpTOOQsn1wnBoSns3g26OL5Ckm7K3ejAwjz0fqRvgfLAcARwCOZAOhWK/q1Z2ZHx/+XW6mzmNQ6edqg9N/ih4ekzN+ipEGE1UiF7SbuI/womFOuoYQ6uc4px3klt2MhB+FtCsvJLzOz9yzOe6yi0Muzea3PhfBDbS7hB0i2TrmViLMkDQDGSfo1Yah1iTJlXYN4T0+DKCyVvc7iklpJnwJ2I0wKPqu4K1VhI6wnuv9MFydpC+B/ZvZGvH0YYU7EFOAUK7HHS/wwO4awQmgi8Fcrn7OmHudYmKBaGOrpR1gxV65HZRzpvTa/JmwPfyhhA8ivA0+aWdUknM1E0v2E/ZbOJCxxP4Lwt192QnozkfQdMztL0klWZn+dGo7RB9iTkBOukzDX7Kzi93KDg4XcbaSSdCVh7sv/i3cdCCxtZl+sZ53uOK8cbaxJeI/vT/gxWTLQ7W6xp/lNYADhh+Awwr5fz/fkebUbD3oapNCVWeo+ld5E8C7CJLyrCEMLdVsxk0rS44TJu+8qrFC4nIW7Pq9rZovt+qywudd8wgf47oQdpr/TwHNMCkhSg6RYpw9hUvanCL0dt5jZX6qc16BYp3j1WrkNy5LK52yjMCfmwyBP0n1m9slKz6VZFP5elGPeV6y/EeFLcA9CD9mlhIDjkBJ/hw0PFnK2kRpYfbiJaaX7ulInZ4CY57xyBYm1BLrKkbpCXdsPqPhYV5jZ/rWWd13nw1uN866kH7HoDp/vKSwL7iwubGY7SlqBkCJijELW3ivM7BfddsYL9c18MOwPjLGwdP6a2GNSynqZL9S/UnkDuHo4nvDFP5GwEu2mKgHJPZJOAAYrZBz/OmEsvpJTzOwkwv5GSOor6VIzO7hCnb8TVoJ8mjAMdTALhzDrUT5PnTnxC+BZSd8EXiWsUmkVT0maAiynRdNpVF0iLOkxQnD8V8JeRoW5Fw8rLFMutnbRF/BdCjuFV5JaJ08blxACpcKu1QcS3gflAqUnJG1lZg8BKOTTK5V6pCt1Us8p73klt1MU6F7DwkD3TsKPt4I8qSu+A1yUOZeNCdnVNyHMY0z5MbF1QllXD9YES8h644Wwhfk5hA0ExxGWTC9H6Npcs0rdDQl/1PN66NwnAf3i9f8C22UfK1Pn8Uq3G3COpxbd7gtcWqF8H8JW9lcBVxPmVVVr4yLCtvHEf7frCYFQpTpPxP8XNsPrT5mtAfKUz9nGxwmb8q1E6Oq/lrCbbLe/t7rw771CfC9uEC/rUGWJcKyXtNw9/ptvlbm9JXBuPevkbGOxjU3L3DeRkCn8KcKPqymE7TA6K/ztJtdJOaeutJHaTnzsMeAOwgaFA4seq7ghaY3vkXGZ6/8AvpO5nfS5R5hG0G1/R34x7+lpFDN7mzDsUspzxXdIWpfQq7IvYQO1ywmTgXvCZYSekbcJe2PcF89xTWCx5b7RxpIKS+5F6FGZRuMmwa4i6cdmdnqcHHgVIcAs5xRL77U5gpAW48fAjsC/zWyx1UNFCqvz3pe0AWFvmFF1LJ9cx8weiVdnEJ5TS4lDkd8j/JC4mBDAFgK4avOr3pH0exZuVXAPIWBe5H2ssCLOCAHkoQq58IwQWD1Z5ryS6uRpI6PWHpI9qxynlDx1Us6pK22ktgNhP7QXSj1gi+fmyzNU1amQ9uY9wkKI0zKPDS4urDKrzwifjdVSzrg686CnQRR2SD6OxZPklVsN8DdCsPEpM3ut4SdYgZmdJukOFu76XJj41YcygZx1bSVWHqkBSc1BUtGH1FmEvT8eIASCm1rlJbljFHZJ/ilhj5uhwEl1LF9zHXVTLq1u8BvC8MNqFrcYiMO/v42XSnPHLiT0XO4Xbx9C+Fv7fFG57ggWkttIDZTM7KWi+suTmfdVSmqdPMFbnvPKEVR+L3O91DmU2togz1DVSYQJ0n0JCW8nxza3B0oFW6VWnxX8t8JjrgF8InODxDH6P7N4JuXHSpTtC1xSpdfBsVhA0p+FAclfofy+GvFX3KWEbvaKQZJK76NSYBUC16Yi6S1CzrXLCEv7F/kmMLN7euK8Ukl6FviYFX1Yxb+b/1qZlBKxzDhbfLLyYveVqLfIl7LVkBk7tU4t5RVW/JRVHExk6u1F+LJdEZhKCBSeMrP1K5xPTXXynlPqeaW2I6niakQz+1mJNj58LyghdYVq2A9I0q5mdlulcyo6ZlJ5l48HPQ2iuGImofzNwF5mNq+Bp9XyUgOSLgRJfQjd5FfUeF4lV39kTmyRX5mp5XO20fBcWt1B0jNmVjK7faXH4uMPAj8ws/vj7W2A35pZyQmkjQwWutJGpm5NgVX80bUTcLuF1Yo7EhLUHl3h2Ml1Us6pK22ktlMrhZWqnyEMVb0E7JTpuXnKzNbtyrHLBU31KO/y8eGtxvmnpK8T8mlld+tcbI+b6CXggTgkMTNTvuxus+3Iwiq3lICkuGv5PcImfb+jwuZjZtYp6RuEDPW1SN00L7V8ch0z6wBuBm5WSMFwIHC3pFPN7JzKtZvKk5IONbNLsndK+hLVhwe+BlyssGGmgHcJudfK+TkhR9IiX8pV2kitk9xGuUCJsG1BKfPN7B1JfST1MbO7JP2qyvNIqpPjnHKdV63tKN/u9qlDVSkWH2Orb3mXgwc9jVP4YP1B5j4jjBeX8lq89CHfF2LbSAlIcgRJWbdJOi62kw1EFwtcS3WdVzmvpPJ562jxXFpnU37H2Gb1DeBaSV8mDBcbYUXaYELS2bLMbBxhkn1hIv0swoKBCWWqNDxYyNlGaqD0vqShwL2EuW9TgWqbhabWyRMg5jmvWttJ3t3ezG6Mw2iLDFXFY3y4f07OoafUYRQfdukGPrzlWpKknxJWllUNSGL5e81su1KPVWjjxRJ3my2eviFb52LCEtb34+2lgd9Z+Y0Dk8qn1FGT5tLKS9JOhF/3Aiab2R0Vyi5FCJY+Sthq4PZ4+zjCcue9y9S7nZDy4nTCarGpwMetQn6k1Do52yhsbDoe2CQG/mPNbIuicmsCIwjbZMwm/Ig6mNA78q8ycwqT66ScU1faSG2nUfIMPfnwVnPyoKdBFBJafg9YxUKSwbUIm5LdWKb8XZTukm2JSbPdLTUgSQ2SunBeT1hMc1HpvrzlU+pI6mThc82+t3o6l1bDSbqeMJT5IGFZ8dKEvZa+E3t/iss3PFjo4hd/TYGSpBuBE8xsQtH9mwMnm9lnSxw7uU7KOXWljdR2Msf8CeF1za6czZ2Qt9rfZJk611rREvl6lnf5eNDTIAppGR4DDjWzDSQNBh60MqtGJGUnPQ8i7BWxwMx+2PCTbQN5em1ivQ1YPFHnJRXKjwd2KHSVS1oGuMfK5PhKLZ+3TrvRoik3+gJvE36ATC9TvuHBQs42UgOrSWa2QZnnWDLXXGqdnAFinvPK2wP1NGFawUQyu99bhVVl1ZTqhdHCBLb/KBoaK3eMpPKuMXxOT+OsYWb7SzoQwMxmSyU2j4hK/AE/IKkllhT3lJSAxMxWy3H8k4EdYhs3EXKK3U/YFr+c3wEPSrqK0LuyH4tuXtbV8nnrtJvCBo6YWYekF8sFPNGo4mAk1n1U0qg61cnTxh8IgVKhx66TMDF7c+AUQgLZrEp73yy2cV7OOqnnlPe88rQD8JaZVdyjqk4OIOwX9kgmoKmU2DS1vGsAD3oaZ17s3TEASWuQWcVVLP5aL+gDbE7Yet+VkCcgSe21IeyOvTEh7cMRkkYAF1Q6LzO7JH6g7UQYRvq8mZXdbTe1fN46bSh1h/DuCBbytJEaKD0i6StWlIdO0pGEnudSUuvkCd7ynFeedgBOlnQBIRVFduVsVybwTylxHs8BP4lD53sSNsLslLRYYtM85V1jeNDTOCcTlguvLOlSYBvg8ArlC6tSIKxmmEJIqOlKSwpIcvbazLYwaXKBwsTYqZRZfaeQCfoYYE1Ct/qfzazsqpTU8nnrtCtL3yG8O4KFPG2kBkrfBa6TdHDmmJsT5jOVW+mWWidP8JbnvPK0A6E3ZR3CvlyF4S2jwqrFakNP5ebaqPbEprnKu/rzoKdBzOw2hY2vtiL8uvyOhXxci5D0ceDlwvCLpMMI83mmUD0fTzurOSCJknttgEclDSfk63qMkLuqXPb4iwlDKvcRAqp1CR/05aSWz1vH1ea7ND5YyNNGUqBkZm8Cn1BY1l2YQ/MvM7uzzPHz1EkO3vKcV552oo1zzG9LHnqS9BjwPmGj0+PNrNCr9LDCJphdKu8awycyN0h8E48zs5kKm6htSujCLN46/XFgFzN7V9J2hESj3yJE/eua2b7dfOotQdK5wAmED6vvEwKScWZWMqGm4hLX+MGzIzCdkN256i64sf4oYKlS3e3x8ezE2X7A2OKJj10pn7eOS1P0pTy5ypdyrjop5WNwfh0wjxKBkpm9Ue386q27zilvO5L+ApyZZ8hXYU+vPYHzCL1EZYeeJK1uZRKbljl2UnnXGB70NIikCYSehY0IQygXEuZebF9UbryZbRyv/4kwCe+UeLtqjiBXPSCJZZKCpEy9zxO6nw2438yuK1NukdUdpVZ7dKV83jqud8gTjDVad51TjqDyKWAN4EXCnJ7CPK6KS9aLhp5uYeHQ0yHZz2F1Q8oZ1zge9DRI4QtJ0knAq2b211JfUpImAaPNbIGk/wJHm9m9hceszDJPV3tAUqLeKKoESbHcuYT5M5fFu/YHnjezb5Qo28HCPXFEmHMwizITZ1PL563jXLtRmUSlxb3sRXWyQ0/XZIaeFts/R4mJTVPLu8byoKdBFJab30z45bAd8BahZ6F4z4ufEH5ZvA2sAmxqZqawR8XFZuZjvSWkBCSZOklBkqTJwAaFcf3Y9T2x1iEx51zPUVoiVB96ahM+kblx9gcOAo40szckrQL8priQmZ0m6Q5gJItOnOtDmNvjStueRQOSiwkrmkoqESR9VdIulYIk4GlCIFr4hbgy5XM2OeeagBISoWaHnlRiG7VSQ09KTGyaWt41lgc9jTOdMAGuQ9LHCEsoLytV0MweKnHfMw0+v1aXGpDUHCRJ+ifhw2kY8JSksfH2lsB/6nL2zrlGSUmEmie5c2pi0+REqK5xfHirQeIY8ScJOX8eIrzhZ5nZwT16Yi2uKCD5OGEJ+YcBiZntUqbetcCxhXH9OO5/hpkt9mEoafvi+7LMzHfKdq5JqQkSlLrm5T09jSMzmxX3lDgndm+O6+mT6gV+m1I4T69NcVAT9wHyvxXnWsP7koYC9wKXSppK2PB1MV0ZelJiYtPU8q4x/IO8cSRpa0KCvMLOyqm7xLoiOQKSpCCp6NhHE7rKZxP27BDhg7FiklLnXPeTtEqcrLw34W/2WMLn7zDg1DLVujL0dCklEpvWsbxrAB/eapC40eBxwANm9itJqwPf9Ulr9VEuILHqWdMXCZJKbTqWKfsssLWV2EnbOddcsluCSLrGzL7Q4PbuN7NtG1XeNYYHPa4lpQYkeYIkSTcTNpScVYdTds41kKQnzGyT4us11k0eepK0M2GCdE2JTVPLu8bw4a0GkbQc8EPCMsnsXhE79dhJ9S7PEzbmq9UPgPUTe21+DPxH0sMs+iHlvXXONR8rc70WeYaeUhObJidCdfXnQU/jXApcQcjjcgxwGGGDQlcfqQFJapAEcD4h+7GPwTvX/DaWNI24W3m8DrXtWP6Wmd2Q2l7xZrN1Lu8awIOexlk2pp74Tpx8e0/cpdnVR2pAkqfXZoGZVcyb45xrDmbWlYUiJ0u6gLShp4ckrWe1JzZNLe8awIOexpkf//+6pM8ArwEr9eD59DapAUmeXpu74lygf7LoB2HZyc/OuZaUZ+hpW+AwSbUmNk0t7xrAJzI3iKQ9gfsIOwWfAywF/CxHF6orQdJphN2YawpIJP3HzD6R2MaLJe6uukLMOddaJE1MHXpKTWyaJxGqqz8PeupM0iDCHJ41Cb0KfzWzkhtjufxSA5LUIMk51z4k/QU4M8/QU0pi0zzlXX150FNnkq4gDG3dB+wOvGRm3+nZs3IpQVJhl9Z4/YtmdlXmsV+a2QkNPFXnXDeT9BSwBlDz0FO5xKZmtlhi0zzlXWN40FNn2W5SSf2AsYUNs1zXdUdAUrTJ2ePZf7/i28651pdn6Cnm9tqJosSmZnZ0Pcq7xujT0yfQCxUmMOPDWg1xQOb6j4se2624sKQfZq5/seixX5ZpQ2Wul7rtnGtxZvZSDHBmEyYwFy6VzDezd4A+kvqY2V3A6DqWdw3gQU/9bSxpWrxMBzYqXM/sG+HySw1IkoKkqNImZ9416lwvI2mvuMv7i8A9wBTg31WqFSc2PYsyiU1zlncN4EFPnZlZXzNbKl6WNLN+meuVNsdytUkNSPL02mxcImgt3PbNxZzrfX4ObAU8Y2arATsDD5QqKGmVeHVvwoanxwI3EzZA/WxXy7vG8n16XKuptOvqoBLlk3tturjJmXOu9cw3s3ckfTj0JOlXZcr+H7Cpmc3MJDa9uMKxU8u7BvKgx7WUHAFJapDknGs/xUNPUyk/9JTtIa5lz67U8q6BPOhxvZr32jjnypG0StwnZ2/CJOZjgYOBYcCpZaqlJjbtSiJUV2e+ZN0551xbKtqeojD0VK1OBzCT2HvMwkTGJRObppZ3jeU9Pc4559pV8tBTau+x9zY3F1+95Zxzrl350FOb8eEt55xzbcmHntqPBz3OOeecaws+vOWcc865tuBBj3POOefaggc9zjnnnGsLHvQ455xzri140OOcc865tvD/AUUTQlpZ3argAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 648x504 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 相关系数矩阵热力图展示\n",
    "import seaborn as sns\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# seaborn默认的图太小，展示不下所有的列，我们先额外指定figure的大小\n",
    "plt.figure(figsize=(9, 7))\n",
    "sns.heatmap(corr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "cb2c5115",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Survived         1.000000\n",
       "Mr              -0.549199\n",
       "Sex             -0.543351\n",
       "Mrs              0.344935\n",
       "Miss             0.332795\n",
       "Pclass_3        -0.322308\n",
       "Cabin_U         -0.316912\n",
       "Pclass_1         0.285904\n",
       "Family_Small     0.279855\n",
       "Fare             0.257307\n",
       "Family_Single   -0.203367\n",
       "Cabin_B          0.175095\n",
       "Embarked_C       0.168240\n",
       "Cabin_D          0.150716\n",
       "Embarked_S      -0.149683\n",
       "Cabin_E          0.145321\n",
       "Family_Large    -0.125147\n",
       "Cabin_C          0.114652\n",
       "Pclass_2         0.093349\n",
       "Master           0.085221\n",
       "Parch            0.081629\n",
       "Age             -0.070323\n",
       "Cabin_F          0.057935\n",
       "SibSp           -0.035322\n",
       "Royalty          0.033391\n",
       "Officer         -0.031316\n",
       "Cabin_T         -0.026456\n",
       "Cabin_A          0.022287\n",
       "FamilySize       0.016639\n",
       "Cabin_G          0.016040\n",
       "PassengerId     -0.005007\n",
       "Embarked_Q       0.003650\n",
       "Name: Survived, dtype: float64"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 我们需要预测的是survived列,我们选择目标列的相关系数绝对值大的特征去训练算法。\n",
    "# 排序靠后的哪些特征可以考虑不要用了\n",
    "corr['Survived'].sort_values(key=lambda x: abs(x), ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f24f359d",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
